抱歉这个听起来含糊的问题,我真的想不出更好的方式来描述我正在尝试做的事情
我有一个 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)
但是,这显然很慢,因为它要处理 81x990000 = 80190000 个条目。
是否有更 numpythonic 的方法来做到这一点?
最佳答案
注意阅读你的问题,我认为你希望你的第二个嵌套循环是 for j 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]
关于python - 取第一个和中间条目、第二个和中间+1个条目的点积,直到middle-1和最后一个条目python/numpy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33569374/