取第一条和中间条、第二条和中间条的点积+;1个条目,直到中间1个和最后一个条目python/numpy
对不起,这个听起来很模糊的问题,我真的想不出更好的方式来描述我正在尝试做什么 我有一个81x99000x3数组,对于81个条目中的每个条目;我需要将第一个条目与第495000个条目(中间)的点积相加,第二个条目与第495001个条目相加,依此类推,直到第4999个条目与最后一个条目相加 现在我把它放在这样一个循环中:取第一条和中间条、第二条和中间条的点积+;1个条目,直到中间1个和最后一个条目python/numpy,python,numpy,Python,Numpy,对不起,这个听起来很模糊的问题,我真的想不出更好的方式来描述我正在尝试做什么 我有一个81x99000x3数组,对于81个条目中的每个条目;我需要将第一个条目与第495000个条目(中间)的点积相加,第二个条目与第495001个条目相加,依此类推,直到第4999个条目与最后一个条目相加 现在我把它放在这样一个循环中: import numpy as np summed = 0 Nt = 990000 i = Nt/2 for k in xrange(81): for j in xrang
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=8019000个条目
有没有一种更简单的方法来实现这一点?NB阅读您的问题,我想您希望第二个嵌套循环是xrange(Nt-I)中j的
:
,因为xrange
排除了上限
我想你可以用你想要的东西:
e、 g
毫无疑问,您甚至可以删除外部循环(尽管在您的情况下,它可能不会加快速度):
给予
由于您希望从
0
一直到494999
条目,因此我认为对于jth
迭代,代码需要稍微编辑,对于xrange(Nt-I)中的j,代码必须是。现在,回到手头的问题,您基本上是将每个3D切片
切成两半,在它们之间进行元素相乘,然后对所有元素求和。这里,切片指的是由轴=(1,2)
形成的二维数组
要解决我们的问题,您可以模拟-
- 用……切成两半
- 对应元素与之间的元素相乘:
- 将所有元素求和为:
m,n,r = array.shape
out = array.reshape(m,2,-1,r).prod(1).sum()
运行时测试并验证输出-
定义功能:
def vectorized_app(array):
m,n,r = array.shape
return array.reshape(m,2,-1,r).prod(1).sum()
def org_app(array):
m,n,r = array.shape
Nt = n
i = Nt/2
summed = 0
for k in xrange(m):
for j in xrange(Nt-i):
vec1 = array[k][j]
vec2 = array[k][j+i]
summed += np.dot(vec1,vec2)
return summed
运行时:
In [94]: array = np.random.rand(81,9900,3)
In [95]: org_app(array)
Out[95]: 300450.24128635536
In [96]: vectorized_app(array)
Out[96]: 300450.24128635362
In [97]: %timeit org_app(array)
1 loops, best of 3: 1.29 s per loop
In [98]: %timeit vectorized_app(array)
100 loops, best of 3: 16.1 ms per loop
你能把你的数组和两个数组分开,然后再点积它们吗?如果我用两个数组,495000x3和一个3x495000数组,然后用点积,数组将是495000x495000,这会给出“数组太大了。”因为这是24502500000个entries,这不是xrange(Nt-I)中j的
取而代之的是?总有一天我必须学会如何很好地使用einsum。非常感谢。无需转置最后一个数组,这样做可能会导致副本丢失。
[ 2.0480375425 1.89065215839]
m,n,r = array.shape
out = array.reshape(m,2,-1,r).prod(1).sum()
def vectorized_app(array):
m,n,r = array.shape
return array.reshape(m,2,-1,r).prod(1).sum()
def org_app(array):
m,n,r = array.shape
Nt = n
i = Nt/2
summed = 0
for k in xrange(m):
for j in xrange(Nt-i):
vec1 = array[k][j]
vec2 = array[k][j+i]
summed += np.dot(vec1,vec2)
return summed
In [94]: array = np.random.rand(81,9900,3)
In [95]: org_app(array)
Out[95]: 300450.24128635536
In [96]: vectorized_app(array)
Out[96]: 300450.24128635362
In [97]: %timeit org_app(array)
1 loops, best of 3: 1.29 s per loop
In [98]: %timeit vectorized_app(array)
100 loops, best of 3: 16.1 ms per loop