取第一个和第二个中间条目,第二个和第二个中间条目的点积,直到中间1和最后一个条目python / numpy

对于模糊的声音问题我很抱歉,我真的想不出更好的方式来描述我想要做的事情

我有一个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]
点赞