两个numpy数组服装乘法的函数

时间:2018-11-07 14:16:58

标签: python numpy matrix-multiplication multiplying numpy-ndarray

我需要一个简单的numpy函数来执行此乘法,而无需 for循环,并且效率更高。

实际上,我想要一个将a的每一行乘以b

的函数
a=np.arange(2,12).reshape(5,2)
b=np.array([[1,2],[3,4]])
c=np.array([[a[i,:]@b] for i in range(a.shape[0])])

4 个答案:

答案 0 :(得分:1)

您可以使用numpy einsum(根据@dobkind的answer编辑过以重塑数组的形状):

c = np.einsum('ki,ij->kj', a, b).reshape(5,1,2)

应该更快。

%timeit np.einsum('ki,ij->kj', a, b).reshape(5,1,2)
1.87 µs ± 10.5 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

相对(使用@矩阵乘法运算符,该运算符在Python 3中有效)

%timeit np.array([[a[i,:]@b] for i in range(a.shape[0])])
10.2 µs ± 36.7 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

答案 1 :(得分:1)

使用numpy.tensordot

c = np.tensordot(a, b, axes=1)

如果您坚持shape是相同的:

c.reshape(5,1,2)

答案 2 :(得分:1)

要使用@,请将a做成一个3d数组(5,1,2),并与(2,2)(或自动广播的(1,2,2))配对。

In [448]: np.array([[a[i,:]@b] for i in range(a.shape[0])])
Out[448]: 
array([[[11, 16]],

       [[19, 28]],

       [[27, 40]],

       [[35, 52]],

       [[43, 64]]])

In [450]: a[:,None,:]@b
Out[450]: 
array([[[11, 16]],

       [[19, 28]],

       [[27, 40]],

       [[35, 52]],

       [[43, 64]]])

这实际上比einsum解决方案要快一点-尽管以这个例子为例,我不会在计时方面做太多事情。

答案 3 :(得分:0)

使用numpy中的matmul函数将两个矩阵相乘。 让我知道这是否有帮助。谢谢。

c = np.matmul(a,b)