对于模糊的声音问题我很抱歉,我真的想不出更好的方式来描述我想要做的事情
我有一个81x990000x3阵列和81个条目中的每一个;我需要将第一个条目的点积与第495000个条目(中间)相加,第二个条目与495001条目相加,依此类推,直到最后一个条目的494999条目.
现在我在这样的循环中完成它:
import numpy as np
summed = 0
Nt = 990000
i = Nt/2
for k in xrange(81):
for j in xrange(Nt-i-1):
vec1 = array[k][j]
vec2 = array[k][j+i]
summed += np.dot(vec1,vec2)
然而,这显然是非常缓慢的,因为它经历了81×990000 = 80190000个条目.
是否有更多的numpythonic方式来做到这一点?
最佳答案 NB读你的问题,我想你希望你的第二个嵌套循环是x in xrange(Nt-i):因为xrange排除了上限.
我想你可以用einsum
得到你想要的东西:
import numpy as np
summed = 0
dim1 = 2 # this is 81 in your case
dim2 = 4 # this is 990000 in your case
array = np.random.random(size=(dim1, dim2, 3))
Nt = dim2
i = Nt // 2
for k in xrange(dim1):
summed = 0
for j in xrange(dim2-i):
vec1 = array[k][j]
vec2 = array[k][j+i]
summed += np.dot(vec1,vec2)
print summed
print '='*70
for k in xrange(dim1):
summed = np.einsum('ij,ij', array[k][:Nt//2], array[k][Nt//2:])
print summed
例如
2.0480375425
1.89065215839
======================================================================
2.0480375425
1.89065215839
毫无疑问,你甚至可以删除外部循环(虽然在你的情况下,它可能不会加快速度):
np.einsum('kij,kij->k', array[:,:Nt//2,:], array[:,Nt//2:,:])
给
[ 2.0480375425 1.89065215839]