Python 具有多个数组的numpy索引
给定两个数据序列(长度相等)和每个数据点的质量值,我想根据给定的评分矩阵计算相似性分数 将以下循环矢量化的最有效方法是什么:Python 具有多个数组的numpy索引,python,arrays,numpy,Python,Arrays,Numpy,给定两个数据序列(长度相等)和每个数据点的质量值,我想根据给定的评分矩阵计算相似性分数 将以下循环矢量化的最有效方法是什么: score = 0 for i in xrange(len(seq1)): score += similarity[seq1[i], seq2[i], qual1[i], qual2[i]] 相似性是一个四维浮点数组,形状=(32,32,100,100); seq1、seq2、qual1和qual2都是长度相等的一维整数数组(1000-40000个数量级)。这难
score = 0
for i in xrange(len(seq1)):
score += similarity[seq1[i], seq2[i], qual1[i], qual2[i]]
相似性
是一个四维浮点数组,形状=(32,32,100,100);
seq1
、seq2
、qual1
和qual2
都是长度相等的一维整数数组(1000-40000个数量级)。这难道不管用吗(tm)
代码:
给出:
>>> timeit slow()
100 loops, best of 3: 3.59 ms per loop
>>> timeit fast()
10000 loops, best of 3: 143 us per loop
>>> np.allclose(slow(),fast())
True
这难道不应该起作用吗(tm)
代码:
给出:
>>> timeit slow()
100 loops, best of 3: 3.59 ms per loop
>>> timeit fast()
10000 loops, best of 3: 143 us per loop
>>> np.allclose(slow(),fast())
True
这个怎么样
score = numpy.sum(map(similarity.__getitem__, zip(seq1, seq2, qual1, qual2)))
当然,您也可以尝试使用itertools imap和izip。zip是必需的,因为\uuuu getitem\uuuuuuuuuuuuuuuuuuuuuuuu>需要一个元组,而不是四个数字……也许可以通过查看itertools模块的较暗角落来改善这一点。这个怎么样
score = numpy.sum(map(similarity.__getitem__, zip(seq1, seq2, qual1, qual2)))
当然,您也可以尝试使用itertools imap和izip。zip是必要的,因为\uuuu getitem\uuuuuuuuuuuuuuuuuuuuu>需要一个元组,而不是四个数字……也许可以通过查看itertools模块的较暗角落来改善这一点。这太好了。我更喜欢这个答案,而不是我自己的答案(尽管我可能会把我的答案留作对比)+1.这真是一个很棒的numpy
功能,我不知道。谢谢在我的机器上进行1000次迭代的计时(包括John Zwinck的答案为“第三次”),长度10000:slow:17.1289219856,fast:0.61208987236,third:15.7027080059太棒了。我更喜欢这个答案,而不是我自己的答案(尽管我可能会把我的答案留作对比)+1.这真是一个很棒的numpy
功能,我不知道。谢谢我的机器上1000次迭代的计时(包括John Zwinck的回答为“第三次”),长度10000:慢:17.1289219856,快:0.61208987236,第三次:15.7027080059