最简单的解决方案
使用numpy.dot
或a.dot(b)
.参见文档here.
>>> a = np.array([[ 5, 1 ,3],
[ 1, 1 ,1],
[ 1, 2 ,1]])
>>> b = np.array([1, 2, 3])
>>> print a.dot(b)
array([16, 6, 8])
之所以会出现这种情况,是因为numpy数组不是矩阵,标准操作*, +, -, /
在数组上按元素运行.
请注意,虽然您可以使用numpy.matrix
(截至2021年初),其中*
将被视为标准矩阵乘法,但104.见the note in its documentation(转载于下文):
不再建议使用该类,即使对于线性代数也是如此.而是使用常规array.这门课将来可能会被取消.
Thanks @HopeKing.个
其他解决方案
另外,您还可以 Select 其他选项:
如下所述,如果使用python3.5+@
操作员按照您的预期工作:
>>> print(a @ b)
array([16, 6, 8])
如果你想杀过头,你可以用numpy.einsum
.文档会让您了解它的工作原理,但老实说,直到阅读this answer并自己动手操作之后,我才完全理解如何使用它.
>>> np.einsum('ji,i->j', a, b)
array([16, 6, 8])
从2016年年中开始(NumPy 1.10.1),您可以try 实验性的numpy.matmul
,它的工作方式与numpy.dot
类似,但有两个主要的例外:没有标量乘法,但它可以处理矩阵堆栈.
>>> np.matmul(a, b)
array([16, 6, 8])
对于矩阵和张量乘法,numpy.inner
的功能与numpy.dot
for matrix-vector multiplication but behaves differently的功能相同(参见维基百科,了解the inner product and dot product与numpy实现的区别).
>>> np.inner(a, b)
array([16, 6, 8])
# Beware using for matrix-matrix multiplication though!
>>> b = a.T
>>> np.dot(a, b)
array([[35, 9, 10],
[ 9, 3, 4],
[10, 4, 6]])
>>> np.inner(a, b)
array([[29, 12, 19],
[ 7, 4, 5],
[ 8, 5, 6]])
边缘 case 的稀有选项
如果有张量(维数大于或等于1的数组),可以将numpy.tensordot
与可选参数axes=1
一起使用:
>>> np.tensordot(a, b, axes=1)
array([16, 6, 8])
Don't use 100如果你有一个复数矩阵,因为矩阵将被展平为1D数组,那么它将试图找到展平矩阵和向量之间的复共轭点积(由于大小不匹配n*m
vs n
,这将失败).