我需要一个简单的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])])
答案 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)
答案 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)