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

取第一条和中间条、第二条和中间条的点积+;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

对不起,这个听起来很模糊的问题,我真的想不出更好的方式来描述我正在尝试做什么

我有一个81x99000x3数组,对于81个条目中的每个条目;我需要将第一个条目与第495000个条目(中间)的点积相加,第二个条目与第495001个条目相加,依此类推,直到第4999个条目与最后一个条目相加

现在我把它放在这样一个循环中:

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