gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 11:26:05 25 4
gpt4 key购买 nike

抱歉这个听起来含糊的问题,我真的想不出更好的方式来描述我正在尝试做的事情

我有一个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com