复杂的numpy数组乘法

时间:2014-01-27 12:12:31

标签: python arrays numpy

我有两个数组:

 a = [[a11,a12],
      [a21,a22]]

 b = [[b11,b12],
      [b21,b22]]

我想要做的是建立一个矩阵如下:

xx = np.mean(a[:,0]*b[:,0])
xy = np.mean(a[:,0]*b[:,1])
yx = np.mean(a[:,1]*b[:,0])
yy = np.mean(a[:,1]*b[:,1])

并返回一个数组c,使

c = [[xx,xy],
      yx,yy]]

在numpy中有一种不错的pythonic方法吗?因为目前我完全按照手工完成,所以输出数组的尺寸是手工编码的,而不是根据输入数组a和b的大小确定的。

1 个答案:

答案 0 :(得分:3)

你的第三个元素是否有错误?如果您认为yx = np.mean(a[:,1]*b[:,0])而不是yx = np.mean(b[:,1]*a[:,0])似乎是合理的,那么您可以尝试以下方法:

a = np.random.rand(2, 2)
b = np.random.rand(2, 2)
>>> c
array([[ 0.26951488,  0.19019219],
       [ 0.31008754,  0.1793523 ]])
>>> np.mean(a.T[:, None, :]*b.T, axis=-1)
array([[ 0.26951488,  0.19019219],
       [ 0.31008754,  0.1793523 ]])

实际上,避免中间数组并将结果表示为矩阵乘法实际上会更快:

>>> np.dot(a.T, b) / a.shape[0]
array([[ 0.26951488,  0.19019219],
       [ 0.31008754,  0.1793523 ]])