2017-08-30 71 views
0

我有两个ndarray像子阵列的numpy点积?

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]。我可以通过手动分割数组和循环来完成。但想知道是否有更多的pythonic和numpy的方式来做到这一点?

回答

2

这里有一种方法:

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]]) 

现在所有元素相乘在一起 - 和总和在右侧轴(有时我想以轴)。

In [126]: (n1.reshape(2,2)*n2.reshape(2,2)).sum(axis=1) 
Out[126]: array([ 5, 25]) 

产品这笔款项还可以与einsum表示 - 但如果语法是太新,也不用担心:

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

重塑有二两个数组,因为我们要子阵列长度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 
+0

感谢您的快速回复!由于只能回答一个答案,我必须选择hpaulj的答案。 :) – dofine

1

可以通过手动相乘并添加阵列进行点。如果您使用的np.addreduceat方法,你已经完全任意间隔求和的灵活性:

n = np.add.reduceat(n1 * n2, [0, 2]) 

如果你想拥有比前三,最后一个要素的总和,你只需通过[0, 3]为指数(第二个参数)。

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

+1

只是为了使其通用:'np.arange(0,n1.size,2)'的指数。 – Divakar

+0

@divakar。那时候,我认为你的答案会更好。如果时间间隔不均匀,则仅需要采矿。 –

+0

如果子阵列的长度是任意的,则为真。 – Divakar