나는 생물 정보학 도구로 작업하고 있으며 각 문자를 반복하기 위해 두 개의 루프를 사용하여 구성했습니다.
입력 (즉, seq1 및 시퀀스)은 AGATGCTAGTA'
동일한 길이의 '와 같은 뉴클레오티드 문자열입니다 . 는 sequence_info
시퀀스의 모든 목록입니다.
엄청나게 느려서 0을 추가 bio_array
하고 numpy 배열로 저장하는 대신 continue를 사용하여 속도를 높였습니다 . 여기에 새로운 코드가 있습니다.
for (sequence, sequence_location) in sequence_info:
value = slow_function(seq1, sequence)
def slow_function(seq1,sequence):
calc=0
for i,nt in enumerate(seq1):
if nt == sequence[i]:
continue
else:
calc += bio_array[i]
return float(calc)
%%timeit
jupyter 노트북에서 사용하면 여전히 100ms
. 주위 또는 아래에 있어야합니다 1-5ms
. 함수를 반복자로 변환하고 루프를 사용하는 대신 목록 이해 /지도를 사용하려고 시도했습니다. 그러나 이러한 방법은 큰 영향을 미치지 않았습니다.
numpy를 사용할 수 있다고 생각하지만 문서를 보거나 stackoverflow에서 사용할 방법을 찾을 수 없었습니다. bio_array
시퀀스에 불일치가 있으면 특정 값을 추가해야하므로 문자열의 각 문자 값을 개별적으로 비교해야한다고 생각합니다.
이 코드의 속도를 최대한 빨리 높이는 가장 좋은 방법은 무엇입니까?
내가 올바르게 이해한다면 두 문자열 시퀀스가 일치하지 않는 위치를 기준으로 배열 요소를 합산하려는 문제가 있습니다. 시퀀스의 문자 배열을 만든 다음 numpy 조건부 인덱싱을 사용하여 일치하지 않는 값을 얻을 수 있습니다. 다음은 축소 된 예입니다.
seq_a = np.array(list('ABCDEFGH'))
seq_b = np.array(list('ABCZEFZH'))
bio_array = np.array([1, 5, 9, 4, 3, 8, 2, 7])
그런 다음 seq_a
및 사이의 요소 별 비교를 수행하면 다음 과 같은 결과를 seq_b
얻을 수 있습니다.
>>> seq_a != seq_b
array([False, False, False, True, False, False, True, False])
그런 다음 bio_array
이 결과로 인덱싱 하여 관련 값을 가져온 다음 합산 할 수 있습니다.
>>> bio_array[seq_a != seq_b]
array([4, 2])
>>> bio_array[seq_a != seq_b].sum()
6
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다