Ichki qavslarni ko'chirib o'tkazish va ro'yxatni tushunish uchun qiymatni belgilash

Belgilangan belgilarni ( A , C , G va T ) paydo bo'lishini hisoblash funktsiyasini yozdim bir xil satrda bir nechta satrlar ichida va so'zlar sonini lug'atda saqlab qo'ying.

Misol uchun, bu ikkita satr "ACGG" va "CAGT" bilan qaytishi kerak:

{'A': [1, 1, 0, 0], 'C': [1, 1, 0, 0], 'G': [0, 0, 2, 1], 'T': [0, 0, 0, 1]}

Tezlikni optimallashtirish uchun kodni tushunish uchun quyidagi kodni aylantirmoqchiman. Ikkita ichki ko'chadan foydalanadi, va Motifs yozuvi A ning C-ning G va T ni o'z ichiga olgan satrlari ro'yxati.

def CountWithPseudocounts(Motifs):
    count = {}
    k = len(Motifs[0])
    t = len(Motifs)
    for s in 'ACGT':
        count[s] = [0] * k
    for i in range(t):
        for j in range(k):
            symbol = Motifs[i][j]
            count[symbol][j] += 1
return count

Ushbu ro'yxatni tushunish uchun funktsiyaning pastki qismida joylashgan ichki formanlarni almashtirishni sinab ko'rdim:

count = [ [ count[Motifs[i][j]][j] += 1 ] for i in range(0, t) ] for j in range(0, k)]

Bu ishlamayapti, ehtimol, ro'yxatni tushunish uchun + = 1 qiymatini belgilashga ruxsat berilmagani uchun. Bu haqda qanday qilib ishlashim mumkin?

14
Belgilar bir xil uzunlikka ega bo'lishi kafolatlangan?
qo'shib qo'ydi muallif Willem Van Onsem, manba
"Tezlikni optimallashtirish uchun quyidagi kodni tushintirishni tushunmoqchiman" - Nima uchun ro'yxatni tushunish tezroq bo'lishi mumkin?
qo'shib qo'ydi muallif marcelm, manba
Ha, ular bir xil uzunlikka ega bo'lishlari kafolatlangan
qo'shib qo'ydi muallif DavidK11, manba

6 javoblar

zip() dan foydalanishingiz mumkin:

In [10]: a = 'ACGG'           

In [11]: b = 'CAGT'

In [12]: chars = ['A', 'C', 'G', 'T'] 

In [13]: [[(ch==i) + (ch==j) for i, j in zip(a, b)] for ch in chars]
Out[13]: [[1, 1, 0, 0], [1, 1, 0, 0], [0, 0, 2, 1], [0, 0, 0, 1]]

Agar lug'at istasangiz, siz dict tushunishni qo'llashingiz mumkin:

In [25]: {ch:[(ch==i) + (ch==j) for i, j in zip(a, b)] for ch in chars}
Out[25]: {'T': [0, 0, 0, 1], 'G': [0, 0, 2, 1], 'C': [1, 1, 0, 0], 'A': [1, 1, 0, 0]}

Yoki siz o'zingizning belgilaringiz ro'yxatidagi tartibda bo'lishini istasangiz, collections.OrderedDict dan foydalanishingiz mumkin:

In [26]: from collections import OrderedDict

In [27]: OrderedDict((ch, [(ch==i) + (ch==j) for i, j in zip(a, b)]) for ch in chars)
Out[28]: OrderedDict([('A', [1, 1, 0, 0]), ('C', [1, 1, 0, 0]), ('G', [0, 0, 2, 1]), ('T', [0, 0, 0, 1])])

Agar siz hali ham ko'proq ishlashga ehtiyoj sezsangiz va/yoki uzoq satr va katta ma'lumotlar majmui bilan ishlayotgan bo'lsangiz, ushbu muammo atrofida vektorlashtirilgan usul bilan ishlash uchun Numpy-dan foydalanishingiz mumkin.

In [61]: pairs = np.array((list(a), list(b))).T

In [62]: chars
Out[62]: 
array(['A', 'C', 'G', 'T'], 
      dtype='
11
qo'shib qo'ydi

zip() dan foydalanishingiz mumkin:

In [10]: a = 'ACGG'           

In [11]: b = 'CAGT'

In [12]: chars = ['A', 'C', 'G', 'T'] 

In [13]: [[(ch==i) + (ch==j) for i, j in zip(a, b)] for ch in chars]
Out[13]: [[1, 1, 0, 0], [1, 1, 0, 0], [0, 0, 2, 1], [0, 0, 0, 1]]

Agar lug'at istasangiz, siz dict tushunishni qo'llashingiz mumkin:

In [25]: {ch:[(ch==i) + (ch==j) for i, j in zip(a, b)] for ch in chars}
Out[25]: {'T': [0, 0, 0, 1], 'G': [0, 0, 2, 1], 'C': [1, 1, 0, 0], 'A': [1, 1, 0, 0]}

Yoki siz o'zingizning belgilaringiz ro'yxatidagi tartibda bo'lishini istasangiz, collections.OrderedDict dan foydalanishingiz mumkin:

In [26]: from collections import OrderedDict

In [27]: OrderedDict((ch, [(ch==i) + (ch==j) for i, j in zip(a, b)]) for ch in chars)
Out[28]: OrderedDict([('A', [1, 1, 0, 0]), ('C', [1, 1, 0, 0]), ('G', [0, 0, 2, 1]), ('T', [0, 0, 0, 1])])

Agar siz hali ham ko'proq ishlashga ehtiyoj sezsangiz va/yoki uzoq satr va katta ma'lumotlar majmui bilan ishlayotgan bo'lsangiz, ushbu muammo atrofida vektorlashtirilgan usul bilan ishlash uchun Numpy-dan foydalanishingiz mumkin.

In [61]: pairs = np.array((list(a), list(b))).T

In [62]: chars
Out[62]: 
array(['A', 'C', 'G', 'T'], 
      dtype='
11
qo'shib qo'ydi

Siz chindan ham ro'yxatni tushunish bo'yicha topshiriqlarni bajarolmaysiz (yaxshi narsalarni chaqirib - yon ta'sirlarni bajarishingiz mumkin). Agar ro'yxatni tushunish iborani kutmoqchi bo'lsa. Bundan tashqari count ga tayinlashni va shu bilan eski count ni yangilashni istagan g'alati.

Buni amalga oshirish uchun lug'at tushunchasi va ro'yxatni tushunish yordamida juda samarali emas:

chars = 'ACGT'

a = 'ACGG'
b = 'CAGT'

sequences = list(zip(a,b))

counts = {char:[seq.count(char) for seq in sequences] for char in chars}

( @Chris_Rands ga kreditlar > seq.count (char) taklifi uchun)

Bu quyidagilarni ishlab chiqaradi:

{'G': [0, 0, 2, 1], 'A': [1, 1, 0, 0], 'C': [1, 1, 0, 0], 'T': [0, 0, 0, 1]}

Qo'shimcha belgilar bilan zip (..) chaqirib, ko'proq satrlarni hisoblash uchun yechimni osongina umumlashtirishingiz mumkin.

Siz o'zingizning algoritmingizni optimallashtirishga qaror qilishingiz mumkin. Bu, ehtimol, samaraliroq bo'ladi, shundan keyin faqat bir marta tizzadan pastga aylantirasiz va lug'atning qidirishini ishlatishingiz mumkin, masalan:

def CountWithPseudocounts(sequences):
    k = len(sequences[0])
    count = {char:[0]*k for char in 'ACGT'}
    for sequence in sequences:
        j = 0
        for symbol in sequence:
            count[symbol][j] += 1
            j += 1
    return count

EDIT:

Agar siz hisoblardagi barcha elementlarga birini qo'shishni xohlasangiz, quyidagilarni foydalanishingiz mumkin:

counts = {char:[seq.count(char)+1 for seq in sequences] for char in chars}
8
qo'shib qo'ydi
@Chris_Rands: bu, albatta, yaxshi taklif va, ehtimol, ish faoliyatini oshiradi.
qo'shib qo'ydi muallif Willem Van Onsem, manba
@ DavidK11: yangilashni ko'ring.
qo'shib qo'ydi muallif Willem Van Onsem, manba
@ DavidK11: Men ta'qib qilmayapman, siz istaysizmi {'G': [1, 1, 3, 2], 'A': [2, 2, 1, 1], ...} ?
qo'shib qo'ydi muallif Willem Van Onsem, manba
@ DavidK11: Men Motifs = ["ACGG", "CAGT"] so'zini vergul bilan ( va da ishlaydi, lekin bu boshqacha) bildirasiz. zip (* Motifs) (yulduzcha * ) dan foydalanishingiz mumkin.
qo'shib qo'ydi muallif Willem Van Onsem, manba
@ Ev.Kounis: ishlash sabablari tufayli: aks holda siz har doim zip (..) ni hisoblashingiz kerak. Keling, faqat bir marta qurilgan.
qo'shib qo'ydi muallif Willem Van Onsem, manba
Oh, rost. Rahmat!
qo'shib qo'ydi muallif Ev. Kounis, manba
nima uchun zip kodini ro'yxatida ( ro'yxatini (zip (a, b)) ga joylashtirasiz?
qo'shib qo'ydi muallif Ev. Kounis, manba
sum() o'rniga nima uchun seq.count (char) dan foydalanmasligingiz kerak?
qo'shib qo'ydi muallif Chris_Rands, manba
@WillemVanOnsem: Ha, aynan shu narsa psevdokunstlar bilan bog'liq.
qo'shib qo'ydi muallif DavidK11, manba
@WillemVanOnsem: Ha, ha, albatta, uni vergul bilan yozishni istadim. Yulduzcha ishlaydi, rahmat! Endi oxirgi savol: Men hisoblash lug'atida pseudocounts qo'shishni istadim, lug'at tushunishda bir qatorda har bir songa 1 raqam kiritish uchun usul bormi?
qo'shib qo'ydi muallif DavidK11, manba
@WillemVanOnsem Men sizning dasturingiz bilan mening algoritmimni qayta yozishni ishlatganman va taxminan 15% ga tezroq. Men sizning echimingizni lug'at tushunchasi bilan sinab ko'rmoqchiman. Lekin men hozir strings ro'yxatimda zip-ni ishlatish bilan muammo yashayman. Qanday qilib boraman: Motifs = ['ACGG' va 'CAGT'] zip (uzoqdan) uchun? Men zip har doim ikkita dalilni talab qiladiganini tushunaman, lekin ro'yxatimdagi barcha satrlarni bosib o'tish uchun zipni qanday qilib olish mumkin?
qo'shib qo'ydi muallif DavidK11, manba

Siz chindan ham ro'yxatni tushunish bo'yicha topshiriqlarni bajarolmaysiz (yaxshi narsalarni chaqirib - yon ta'sirlarni bajarishingiz mumkin). Agar ro'yxatni tushunish iborani kutmoqchi bo'lsa. Bundan tashqari count ga tayinlashni va shu bilan eski count ni yangilashni istagan g'alati.

Buni amalga oshirish uchun lug'at tushunchasi va ro'yxatni tushunish yordamida juda samarali emas:

chars = 'ACGT'

a = 'ACGG'
b = 'CAGT'

sequences = list(zip(a,b))

counts = {char:[seq.count(char) for seq in sequences] for char in chars}

( @Chris_Rands ga kreditlar > seq.count (char) taklifi uchun)

Bu quyidagilarni ishlab chiqaradi:

{'G': [0, 0, 2, 1], 'A': [1, 1, 0, 0], 'C': [1, 1, 0, 0], 'T': [0, 0, 0, 1]}

Qo'shimcha belgilar bilan zip (..) chaqirib, ko'proq satrlarni hisoblash uchun yechimni osongina umumlashtirishingiz mumkin.

Siz o'zingizning algoritmingizni optimallashtirishga qaror qilishingiz mumkin. Bu, ehtimol, samaraliroq bo'ladi, shundan keyin faqat bir marta tizzadan pastga aylantirasiz va lug'atning qidirishini ishlatishingiz mumkin, masalan:

def CountWithPseudocounts(sequences):
    k = len(sequences[0])
    count = {char:[0]*k for char in 'ACGT'}
    for sequence in sequences:
        j = 0
        for symbol in sequence:
            count[symbol][j] += 1
            j += 1
    return count

EDIT:

Agar siz hisoblardagi barcha elementlarga birini qo'shishni xohlasangiz, quyidagilarni foydalanishingiz mumkin:

counts = {char:[seq.count(char)+1 for seq in sequences] for char in chars}
8
qo'shib qo'ydi
@ DavidK11: yangilashni ko'ring.
qo'shib qo'ydi muallif Willem Van Onsem, manba
@ DavidK11: Men ta'qib qilmayapman, siz istaysizmi {'G': [1, 1, 3, 2], 'A': [2, 2, 1, 1], ...} ?
qo'shib qo'ydi muallif Willem Van Onsem, manba
@ DavidK11: Men Motifs = ["ACGG", "CAGT"] so'zini vergul bilan ( va da ishlaydi, lekin bu boshqacha) bildirasiz. zip (* Motifs) (yulduzcha * ) dan foydalanishingiz mumkin.
qo'shib qo'ydi muallif Willem Van Onsem, manba
@Chris_Rands: bu, albatta, yaxshi taklif va, ehtimol, ish faoliyatini oshiradi.
qo'shib qo'ydi muallif Willem Van Onsem, manba
@ Ev.Kounis: ishlash sabablari tufayli: aks holda siz har doim zip (..) ni hisoblashingiz kerak. Keling, faqat bir marta qurilgan.
qo'shib qo'ydi muallif Willem Van Onsem, manba
Oh, rost. Rahmat!
qo'shib qo'ydi muallif Ev. Kounis, manba
nima uchun zip kodini ro'yxatida ( ro'yxatini (zip (a, b)) ga joylashtirasiz?
qo'shib qo'ydi muallif Ev. Kounis, manba
sum() o'rniga nima uchun seq.count (char) dan foydalanmasligingiz kerak?
qo'shib qo'ydi muallif Chris_Rands, manba
@WillemVanOnsem: Ha, aynan shu narsa psevdokunstlar bilan bog'liq.
qo'shib qo'ydi muallif DavidK11, manba
@WillemVanOnsem: Ha, ha, albatta, uni vergul bilan yozishni istadim. Yulduzcha ishlaydi, rahmat! Endi oxirgi savol: Men hisoblash lug'atida pseudocounts qo'shishni istadim, lug'at tushunishda bir qatorda har bir songa 1 raqam kiritish uchun usul bormi?
qo'shib qo'ydi muallif DavidK11, manba
@WillemVanOnsem Men sizning dasturingiz bilan mening algoritmimni qayta yozishni ishlatganman va taxminan 15% ga tezroq. Men sizning echimingizni lug'at tushunchasi bilan sinab ko'rmoqchiman. Lekin men hozir strings ro'yxatimda zip-ni ishlatish bilan muammo yashayman. Qanday qilib boraman: Motifs = ['ACGG' va 'CAGT'] zip (uzoqdan) uchun? Men zip har doim ikkita dalilni talab qiladiganini tushunaman, lekin ro'yxatimdagi barcha satrlarni bosib o'tish uchun zipni qanday qilib olish mumkin?
qo'shib qo'ydi muallif DavidK11, manba

Tezlikni ishlash juda muhim bo'lsa, @Kasramvs tomonidan taqdim etilgan numpy yondoshuvni taklif qilaman.

Bundan tashqari, hisoblash charsalari zamonaviy kompyuterlarga nisbatan xushmuomalalikka ega emas va siz hisoblashdan oldin kirish satrlarini indekslash/aralashtirish haqida ba'zi fokuslar bilan o'ynashingiz mumkin. Misol uchun, har bir simvolda faqat 4 ta harf mavjud bo'lganligi uchun va har bir xarita faqat 4 ta harfdan iborat bo'ladi: 'A', 'C', 'G', 'T', shuning uchun u barcha "ACGT" birikmalarini osonlik bilan ifodalaydi "AAAA" dan "TTTT" dan raqamga, xash yoki sirli kodga ega. Kombinatsiyalarning hajmi bu erda 4x4x4x4 = 256 xil raqamga teng bo'lishi kerak.

Buning o'rniga kodni hisoblash. Masalan, har bir "AAAA" ni ko'rganingizda va keyin uni python ro'yxati yoki numpy qatorida 0x0 deb hisoblasangiz, "AAAC" ga qarang va 0x1 deb hisoblang va aksincha. Shundan so'ng, siz 0x0 ~ 0xFF (255) dan va mos keladigan voqealardan farq qiluvchi indekslar bilan binning qatorini olasizmi? Esingizda bo'lsa, 0x0 dan biri A: {1, 1, 1, 1} yoki C: {0, 0, 0, 7} bilan birga 7: 0x1 uchun A: {7, 7, 7, 0} ... Hammalarini diqqat bilan jamlab, natijasi.

Bu kabi fokuslar, bu holatda tez ishlashini ko'paytirishga yordam berishi kerak. Tezlik ikki omilga bog'liq: birinchisi, endi kompyuterlar chars o'rniga raqamlar bilan ishlaydi, raqamlar charsalarga nisbatan tartiblash, hisoblash, guruhlashtirish, ajratish yoki indekslarni ancha osonroq qilishdir; ikkinchisi esa tabiat tomonidan keshni kattalashib ketish darajasidan ancha yuqori, chunki bu fokuslarda xotira izi juda kam.

Umid qilamanki bu yordam berishi mumkin. :)

Ehtimol, ochiq havola bo'lishi uchun quyidagi kodlarni qo'shing.

Avvalo, import:

    import itertools
    import numpy as np

Dict t02 , odatda, 1M dan kamroq kalit-juft juftligini bildirmaydi, shuning uchun quyida berilgan encode_sequence() funktsiyasi juda tez bo'lishi kerak:

    def encode_sequence(tsq):
        t00 = itertools.product('ACGT', repeat=4)
        t01 = np.array(list(t00)).view('|U4').ravel()

        t02 = dict(zip(t01, np.arange(len(t01))))

        t03 = [t02[i] for i in tsq]

        return t03

"Kodni hisoblash" haqida ma'lumot berish uchun tsenar, map_decode yaratish uchun quyidagi qismdan foydalaning ... Bundan tashqari, ushbu qismning ostidagi kengaytirilgan matris konvertatsiyasi deb ataladigan matematik makr mavjud Keyinchalik foydalanish uchun ll0 va "ACGT" kodlarini aynan shu tarzda o'zgartiradi map_decode .

    ll0 = np.array([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]])
    map_decode = np.array(list(itertools.product(ll0, repeat=4)))

Sinovning navbatini to'ldiring va tarjima qiling,

    test_seq = ('ACGG', 'CAGT', 'CCGA', 'AAAT', 'TTGC', 'GCAT', 'ACGG', 'AAAT')
    u01 = encode_sequence(test_seq)

Voqealarni hisoblash; Quyidagi blokka tezlikni oshirishning asosiy manbai bo'lishi kerak, chunki kompyuter u01 da raqamlarni ishlashda yaxshi,

    p01, q01 = np.unique(u01, return_counts=True)

Natijada, chiqdi hosil qiling ... Bu erda biroz qiyin, masalan, p01 test_seq map_decode map p01 <html> [0, 0, 0, 0], G: [0, 0, 0, 0] va T: [0, 0, 0, 0] 0, 0, 0]. Shu tarzda kodlangan map_decode [p01] shu bilan hisoblash orqali q01 hisobga olinadi va hisobot uchun yig'ishga tayyor:

    np.sum(map_decode[p01]*q01[:, None, None], axis=0).T

Va aytadiki,

    array([[4, 3, 3, 1],
           [2, 4, 0, 1],
           [1, 0, 5, 2],
           [1, 1, 0, 4]])

A: {4, 3, 3, 1}, C: {2, 4, 0, 1}, G: {1, 0, 5, 2} va T: {1, 1, 0, 4 }. Bu savolga javob berishini tekshiring.

Bu raqamli dastur; asosiy tanada hech qanday aniq aylanish mavjud emas. Bundan tashqari, encode_sequence() funksiyasi oldindan ishlashni oshirish uchun ayrim oflayn rejimlarga kirishlar bilan almashtirilishi mumkin. Yuqoridagi qismlar tezligi o'lchovi bo'lmasa-da, ular ma'lum darajada tezlashtirilishi kerak deb o'ylayman. :)


Xo'sh, kelajakda nima bo'lishini muhokama qilaylik.

Biz ushbu ketma-ketlikni misol sifatida ishlatamiz,

    test_seq0 = ((
            'A'*40, 'A'*40, 'A'*40, 'C'*40, 'C'*40,
            'C'*40, 'C'*40, 'G'*40, 'G'*40, 'T'*40
        ))*4

test_seq0 tarkibida 40 ta satr mavjud va har bir satrda 40 ta belgi mavjud. Bu shunday ko'rinadi,

    In: len(test_seq0), test_seq0
    Out: (40,
           ('AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA',
            'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA',
            'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA',
            'CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC',
            'CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC',
                     ... skip 30 lines ...
            'CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC',
            'CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC',
            'GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG',
            'GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG',
            'TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT'))

Juda kulgili ko'rinish, to'g'rimi?

Keyin uzun kodli versiyasi uchun encode_sequence() ni qayta tiklashimiz kerak,

    def encode_sequence_longstring(tsq_np):
        t00 = itertools.product('ACGT', repeat=4)
        t01 = np.array(list(t00)).view('|U4').ravel()

        t02 = dict(zip(t01, np.arange(len(t01))))

        t03 = np.empty_like(tsq_np, dtype=np.uint)
        t03.ravel()[:] = [t02[i] for i in tsq_np.ravel()]

        return t03

tsq_np bu erda oddiy satrlar ro'yxatiga ega bo'lishiga ehtiyot bo'ling. Postfix _np endi raqamli qator degan ma'noni anglatadi.

Asl kodni test_seq0 bilan numpy tarzda ajratib oling,

    In: v01 = np.asarray(test_seq0).view('|U4').reshape(-1, int(40/4))
    In: v01
    Out: 
    array([['AAAA', 'AAAA', 'AAAA', 'AAAA', 'AAAA', 'AAAA', 'AAAA', 'AAAA', 'AAAA', 'AAAA'],
           ['AAAA', 'AAAA', 'AAAA', 'AAAA', 'AAAA', 'AAAA', 'AAAA', 'AAAA', 'AAAA', 'AAAA'],
           ['AAAA', 'AAAA', 'AAAA', 'AAAA', 'AAAA', 'AAAA', 'AAAA', 'AAAA', 'AAAA', 'AAAA'],
           ['CCCC', 'CCCC', 'CCCC', 'CCCC', 'CCCC', 'CCCC', 'CCCC', 'CCCC', 'CCCC', 'CCCC'],
           ['CCCC', 'CCCC', 'CCCC', 'CCCC', 'CCCC', 'CCCC', 'CCCC', 'CCCC', 'CCCC', 'CCCC'],
                ... skip 30 lines ...
           ['CCCC', 'CCCC', 'CCCC', 'CCCC', 'CCCC', 'CCCC', 'CCCC', 'CCCC', 'CCCC', 'CCCC'],
           ['CCCC', 'CCCC', 'CCCC', 'CCCC', 'CCCC', 'CCCC', 'CCCC', 'CCCC', 'CCCC', 'CCCC'],
           ['GGGG', 'GGGG', 'GGGG', 'GGGG', 'GGGG', 'GGGG', 'GGGG', 'GGGG', 'GGGG', 'GGGG'],
           ['GGGG', 'GGGG', 'GGGG', 'GGGG', 'GGGG', 'GGGG', 'GGGG', 'GGGG', 'GGGG', 'GGGG'],
           ['TTTT', 'TTTT', 'TTTT', 'TTTT', 'TTTT', 'TTTT', 'TTTT', 'TTTT', 'TTTT', 'TTTT']], 
          dtype='

v01 da yana bir kulgili ko'rinish. :)

u02 hash kodlarini shu tarzda hisoblash uchun v01 dan foydalaning. Ushbu o'zgaruvchilar va funktsiyalar atrofida ba'zi numpy konventsiyalari mavjud. Faqat shu hayoliy fokuslardan foydalanishga o'rganing; bunga arziydi,

    In: u02 = encode_sequence_longstring(v01)
    In: u02
    Out: 
    array([[  0,   0,   0,   0,   0,   0,   0,   0,   0,   0],
           [  0,   0,   0,   0,   0,   0,   0,   0,   0,   0],
           [  0,   0,   0,   0,   0,   0,   0,   0,   0,   0],
           [ 85,  85,  85,  85,  85,  85,  85,  85,  85,  85],
           [ 85,  85,  85,  85,  85,  85,  85,  85,  85,  85],
               ... skip 30 lines ...
           [ 85,  85,  85,  85,  85,  85,  85,  85,  85,  85],
           [ 85,  85,  85,  85,  85,  85,  85,  85,  85,  85],
           [170, 170, 170, 170, 170, 170, 170, 170, 170, 170],
           [170, 170, 170, 170, 170, 170, 170, 170, 170, 170],
           [255, 255, 255, 255, 255, 255, 255, 255, 255, 255]],
       dtype=uint64)

Kuzatuv bilan u02 deyish mumkin, bu v01 ning 1-to-1 xaritalashidir. U har bir "AAAA" ni kutilganidek 0x0 ga ko'chiradi.

Bundan buyon u02 map test_seq0 bilan bog'liq bo'lgan barcha ma'lumotlarni o'z ichiga oladi. Numpy yordamida uni u02 dan chiqarish,

    s01 = np.empty((4, 0))
    for u03 in u02.T:
        p02, q02 = np.unique(u03, return_counts=True)
        s02 = np.sum(map_decode[p02]*q02[:, None, None], axis=0).T
        s01 = np.hstack((s01, s02))

Python-ning mahalliy turkumidagi boshlang'ich qoidasi bor: siz uni ishlatishingiz mumkin, lekin uni ishlash sezgir hududdan tashqarida foydalaning. Biroq, bu vaziyatni hukm qilish uchun tajribaga muhtojdir.

Keling, s01 quyidagi kutilgan hisobotdir:

    In: s01
    Out:
    array([[ 12.,  12.,  12.,  12.,  12.,  12.,  12.,  12.,  12.,  12.,  12.,
             12.,  12.,  12.,  12.,  12.,  12.,  12.,  12.,  12.,  12.,  12.,
             12.,  12.,  12.,  12.,  12.,  12.,  12.,  12.,  12.,  12.,  12.,
             12.,  12.,  12.,  12.,  12.,  12.,  12.],
           [ 16.,  16.,  16.,  16.,  16.,  16.,  16.,  16.,  16.,  16.,  16.,
             16.,  16.,  16.,  16.,  16.,  16.,  16.,  16.,  16.,  16.,  16.,
             16.,  16.,  16.,  16.,  16.,  16.,  16.,  16.,  16.,  16.,  16.,
             16.,  16.,  16.,  16.,  16.,  16.,  16.],
           [  8.,   8.,   8.,   8.,   8.,   8.,   8.,   8.,   8.,   8.,   8.,
              8.,   8.,   8.,   8.,   8.,   8.,   8.,   8.,   8.,   8.,   8.,
              8.,   8.,   8.,   8.,   8.,   8.,   8.,   8.,   8.,   8.,   8.,
              8.,   8.,   8.,   8.,   8.,   8.,   8.],
           [  4.,   4.,   4.,   4.,   4.,   4.,   4.,   4.,   4.,   4.,   4.,
              4.,   4.,   4.,   4.,   4.,   4.,   4.,   4.,   4.,   4.,   4.,
              4.,   4.,   4.,   4.,   4.,   4.,   4.,   4.,   4.,   4.,   4.,
              4.,   4.,   4.,   4.,   4.,   4.,   4.]])

Yuqoridan pastgacha 4 satrni o'qing va "A", "C", "G", "T" navbati bilan.

Shu bilan birga, shunga o'xshash tarzda 40x10x4000 test_seq0 ni sinab ko'rdim,

    test_seq0 = ((
            'A'*40, 'A'*40, 'A'*40, 'C'*40, 'C'*40,
            'C'*40, 'C'*40, 'G'*40, 'G'*40, 'T'*40
        ))*4000

Hisobotda,

    array([[ 12000.,  12000.,  12000.,  12000.,  12000.,  12000.,  12000.,
             12000.,  12000.,  12000.,  12000.,  12000.,  12000.,  12000.,
             12000.,  12000.,  12000.,  12000.,  12000.,  12000.,  12000.,
             12000.,  12000.,  12000.,  12000.,  12000.,  12000.,  12000.,
             12000.,  12000.,  12000.,  12000.,  12000.,  12000.,  12000.,
             12000.,  12000.,  12000.,  12000.,  12000.],
           [ 16000.,  16000.,  16000.,  16000.,  16000.,  16000.,  16000.,
             16000.,  16000.,  16000.,  16000.,  16000.,  16000.,  16000.,
             16000.,  16000.,  16000.,  16000.,  16000.,  16000.,  16000.,
             16000.,  16000.,  16000.,  16000.,  16000.,  16000.,  16000.,
             16000.,  16000.,  16000.,  16000.,  16000.,  16000.,  16000.,
             16000.,  16000.,  16000.,  16000.,  16000.],
           [  8000.,   8000.,   8000.,   8000.,   8000.,   8000.,   8000.,
              8000.,   8000.,   8000.,   8000.,   8000.,   8000.,   8000.,
              8000.,   8000.,   8000.,   8000.,   8000.,   8000.,   8000.,
              8000.,   8000.,   8000.,   8000.,   8000.,   8000.,   8000.,
              8000.,   8000.,   8000.,   8000.,   8000.,   8000.,   8000.,
              8000.,   8000.,   8000.,   8000.,   8000.],
           [  4000.,   4000.,   4000.,   4000.,   4000.,   4000.,   4000.,
              4000.,   4000.,   4000.,   4000.,   4000.,   4000.,   4000.,
              4000.,   4000.,   4000.,   4000.,   4000.,   4000.,   4000.,
              4000.,   4000.,   4000.,   4000.,   4000.,   4000.,   4000.,
              4000.,   4000.,   4000.,   4000.,   4000.,   4000.,   4000.,
              4000.,   4000.,   4000.,   4000.,   4000.]])

va 1 soniyadan kamroq vaqt ichida tugatildi (ENTER tugmachasini bosing va tugadi) MacBook Pro-da, bu yirtqich hayvon emas. :)

6
qo'shib qo'ydi
Shuni esdan chiqarib qo'ygan edimki, indekslash uchun katta hajmli (masalan, bu holda t02 yoki map_decode ) saqlash hajmi va tezligi uchun juda zararli. CPU arxitekturalari juda kichik keshni o'zlarining kichik keshlariga moslashtiradilar va operatsion tizimlar xotirani qanday almashtirish va almashtirish bilan bog'liq bo'lgan boshqa ishlashni belgilaydi, bu odatda, kutilgan to-tez tezkor qatorni yaxshi tanlovga olib keladi. bir nechta sahifadan kam. Bo'ling va zabt etishni tanlashda bu yodingizda bo'lsin. :)
qo'shib qo'ydi muallif Murray Lee, manba
Tasvirni qo'shimcha qatorlarga qo'shdim.
qo'shib qo'ydi muallif Murray Lee, manba
Menimcha, bu. 10 ta charm uzunligi uchun zarur bo'lgan hash tugmachalari hajmi 4 * 4 * 4 * 4 ... * 4 yoki 4 ^ 10 ga oshadi, bu esa taxminan 1Mga olib keladi, bu mening bajarilishimning yuqori chegarasi bo'lishini kutmoqdaman. map_decode da keng tensorga ega bo'lasiz. Sizga faqatgina 5 ta belgidan 5 ta charm kabi 10 satrni ajratib ko'rsatishga harakat qiling. Ularni mustaqil ravishda sanab, keyin ularni birlashtir. Dizayn tartibiga qarab numpy.vstack() yoki numpy.hstack() yordamida bajarish oson bo'lishi kerak. :)
qo'shib qo'ydi muallif Murray Lee, manba
Men bu yondashuvni tatbiq qildim, ammo test belgilarini 10 belgigacha bo'lgan belgilar bilan sinab ko'rsam, bu mening intervalgacha nisbatan yondashuvim bilan solishtirganda juda sekinlashadi. 'Repeat = 4' so'zini "repeat = k" bilan almashtirdim, unda k = 10 ni belgiladim. Bundan tashqari, '| U4' ni '| U10' deb o'zgartirdim. Men Snakeviz bilan ishlash vaqtini tahlil qilsam, ko'pchilik vaqt numpy qatoriga sarflangan kabi ko'rinadi (men qatorni yaratish yoki o'qishdan ishonchim komil emas). Bu qator kvadratik ravishda ko'payganligi sababmi?
qo'shib qo'ydi muallif DavidK11, manba

Sizning do'stingiz :)

s1 = 'ACGG'
s2 = 'CAGT'

from collections import Counter
counter = Counter(enumerate(s1))
counter += Counter(enumerate(s2))

Chiqish formati: ((pozitsiya, belgi), voqealar soni)

sorted(counter.items())
[((0, 'A'), 1),
 ((0, 'C'), 1),
 ((1, 'A'), 1),
 ((1, 'C'), 1),
 ((2, 'G'), 2),
 ((3, 'G'), 1),
 ((3, 'T'), 1)]

[counter[i,'A'] if (i,'A') in counter else 0 for i in range(4)]
[1, 1, 0, 0]

[counter[i,'C'] if (i,'C') in counter else 0 for i in range(4)]
[1, 1, 0, 0]

[counter[i,'G'] if (i,'G') in counter else 0 for i in range(4)]
[0, 0, 2, 1]

[counter[i,'T'] if (i,'T') in counter else 0 for i in range(4)]   
[0, 0, 0, 1]
0
qo'shib qo'ydi
Python
Python
372 ishtirokchilar

Bu guruh python dasturlash tilini muhokama qilish uchun. Iltimos, o'zingizni hurmat qiling va faqat dasturlash bo'yicha yozing. Botlar mavzusini @botlarhaqida guruhida muhokama qling! FAQ: @PyFAQ Offtopic: @python_uz_offtopic

Python offtopic group !
Python offtopic group !
150 ishtirokchilar

@python_uz gruppasining offtop gruppasi. offtop bo'lsa ham reklama mumkin emas ) Boshqa dasturlash tiliga oid gruppalar @languages_programming