子阵列的numpy点积?

子阵列的numpy点积?,numpy,numpy-einsum,Numpy,Numpy Einsum,我有两个孩子 n1 = np.array([1,2,3,4]) n2 = np.array([1,2,3,4]) 而用np.dot(n1,n2)可以很容易地得到它们的点积,正确答案是30。如果我需要在n1和n2的两个子阵列上操作点,例如 np.dot(np.array([1,2]), np.array([1,2])) # first two elements from arrays np.dot(np.array([3,4]), np.array([3,4])) # last two el

我有两个孩子

n1 = np.array([1,2,3,4])
n2 = np.array([1,2,3,4])
而用
np.dot(n1,n2)
可以很容易地得到它们的点积,正确答案是30。如果我需要在n1和n2的两个子阵列上操作点,例如

np.dot(np.array([1,2]), np.array([1,2]))  # first two elements from arrays
np.dot(np.array([3,4]), np.array([3,4]))  # last two elements
给出[5,25]。我可以通过手动拆分数组和for循环来完成。但是想知道是否有一种更具python和numpy风格的方法来实现这一点吗?

这里有一种方法:

In [124]: n1 = np.array([1,2,3,4])
     ...: n2 = np.array([1,2,3,4])
     ...: 
重塑将阵列拆分为所需的块:

In [125]: n1.reshape(2,2)
Out[125]: 
array([[1, 2],
       [3, 4]])
现在将所有元素相乘-并在右轴上求和(有时我猜是轴)

这些乘积之和也可以用
einsum
表示,但如果语法太新,请不要担心:

In [127]: np.einsum('ij,ij->i',n1.reshape(2,2), n2.reshape(2,2))
Out[127]: array([ 5, 25])
这里有一个方法:

In [124]: n1 = np.array([1,2,3,4])
     ...: n2 = np.array([1,2,3,4])
     ...: 
重塑将阵列拆分为所需的块:

In [125]: n1.reshape(2,2)
Out[125]: 
array([[1, 2],
       [3, 4]])
现在将所有元素相乘-并在右轴上求和(有时我猜是轴)

这些乘积之和也可以用
einsum
表示,但如果语法太新,请不要担心:

In [127]: np.einsum('ij,ij->i',n1.reshape(2,2), n2.reshape(2,2))
Out[127]: array([ 5, 25])

重塑为有两个两列数组,因为我们希望每个子数组的长度
2
,然后使用
np.einsum
进行总和缩减-

a = n1.reshape(-1,2)
b = n2.reshape(-1,2)

out = np.einsum('ij,ij->i',a,b)
另一种方法是进行元素乘法,然后使用一个整形,最后对每行求和,得到一个紧凑的解决方案-

out = (n1*n2).reshape(-1,2).sum(1) # 2 is subarray length

重塑为有两个两列数组,因为我们希望每个子数组的长度
2
,然后使用
np.einsum
进行总和缩减-

a = n1.reshape(-1,2)
b = n2.reshape(-1,2)

out = np.einsum('ij,ij->i',a,b)
另一种方法是进行元素乘法,然后使用一个整形,最后对每行求和,得到一个紧凑的解决方案-

out = (n1*n2).reshape(-1,2).sum(1) # 2 is subarray length

可以通过手动相乘和添加阵列来执行点运算。如果使用的方法,可以灵活地在完全任意的时间间隔上求和:

n = np.add.reduceat(n1 * n2, [0, 2])
如果您想在前三个元素和最后一个元素上求和,只需传递索引的
[0,3]
(第二个参数)


如果您对任意长度的间隔不感兴趣,请使用其他答案。

您可以通过手动相乘和添加数组来执行点运算。如果使用的方法,可以灵活地在完全任意的时间间隔上求和:

n = np.add.reduceat(n1 * n2, [0, 2])
如果您想在前三个元素和最后一个元素上求和,只需传递索引的
[0,3]
(第二个参数)


如果您对任意长度的间隔不感兴趣,请使用其他答案。

谢谢您的快速回复!由于只能接受一个答案,我必须选择hpaulj的答案。:)谢谢你的快速回复!由于只能接受一个答案,我必须选择hpaulj的答案。:)只是为了让它更通用:
np.arange(0,n1.size,2)
用于索引。@divakar。到那时,我认为你的答案会更好。只有在间隔不均匀的情况下才需要使用我的。如果子数组的长度任意,则为True。只是为了使其通用:
np.arange(0,n1.size,2)
用于索引。@divaker。到那时,我认为你的答案会更好。只有在间隔不均匀的情况下才需要地雷。如果子阵列长度任意,则为真。