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

标签 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)

但是,这显然很慢,因为它要处理 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/

相关文章:

python - “property”对象不可迭代,尝试在调用正在使用的 API 后获取响应

python - 引发似乎来自调用者的异常

python - 安装uwsgi后,python还是会报错: No module named 'uwsgi'

python - numpy 数组中的字典?

python - 系列的长度与 np.where 不匹配

python - 慢 scipy 双正交积分

python - 遵循动态分数

python - datetime.fromtimestamp() 比 datetime.utcfromtimestamp() 花费的时间更长

python - 如果您只是操作二进制值序列,您会使用 numpy 吗?

python - Pandas:如何在一系列列中找到第一个有效列