>>> A = [np.random.random((5, 5)) for i in xrange(4)]
>>> product1 = A[0].dot(A[1]).dot(A[2]).dot(A[3])
>>> product2 = reduce(numpy.dot, A)
>>> numpy.all(product1 == product2)
True
A_list = [np.random.randn(100, 100) for i in xrange(10)]
B = np.eye(A_list[0].shape[0])
for A in A_list:
B = np.dot(B, A)
C = reduce(np.dot, A_list)
assert(B == C)
import numpy as np #
def matrix_multiply(matrix1, matrix2):
print(f"Matrix A:\n {A}\n")#Print the Matrix contents
print(f"Matrix B:\n {B}\n")
if A.shape[1] == B.shape[0]:#Check if matrices can be multiplied
C = np.matmul(A,B) #Use matmul to multiply the matrices
return C #Return the resulting matrix
else:
return "Sorry, cannot multiply A and B."#Error catching
# Use np to generate dataset
np.random.seed(27)
A = np.random.randint(1,10,size = (5,4))
B = np.random.randint(1,10,size = (4,2))
# Testing the function
result= matrix_multiply(A,B) #Call matrix_multiply to find answer
print(result)
#References:
#https://geekflare.com/multiply-matrices-in-python/#geekflare-toc-use-python-nested-list-comprehension-to-multiply-matrices
#https://www.anaconda.com/download
#Launch VS Code from Anaconda
6条答案
按热度按时间bis0qfac1#
这可能是一个相对较新的功能,但我喜欢:
字符串
或者如果你有一个长链,你可以这样做:
型
更新:
这里有更多关于reduce的信息。这里有一个例子可能会有帮助。
型
2016年更新:从python 3.5开始,有一个新的matrix_multiply符号,
@
:型
bqjvbblv2#
更新一个老问题:
从November 13, 2014开始,现在有一个
np.linalg.multi_dot
函数可以完全满足你的需要,它还可以优化调用顺序,尽管在你的情况下这不是必需的。请注意,这从numpy 1.10版本开始可用。
fnvucqvd3#
如果你事先计算所有的矩阵,那么你应该使用一个优化方案来进行矩阵链乘法。参见this Wikipedia article。
db2dz4w84#
另一种方法是使用
einsum
,它为NumPy实现了Einstein summation convention。简单地解释一下这个问题的约定:当你把你的多矩阵乘积写成一个大的乘积和时,你会得到这样的结果:
字符串
其中
P
是乘积的结果,A1
、A2
、A3
和A4
是输入矩阵。请注意,您对在被加数中出现两次的索引进行求和,即j
、k
和l
。由于具有此属性的和经常出现在物理学中,向量微积分,可能还有其他一些字段,有一个NumPy工具,即einsum
。在上面的例子中,你可以用它来计算你的矩阵乘积,如下所示:
型
这里,第一个参数告诉函数哪些索引应用于参数矩阵,然后对所有双重出现的索引求和,产生所需的结果。
请注意,计算效率取决于几个因素(所以你可能最好只测试它):
3yhwsihp5#
字符串
ix0qys7i6#
这在VS代码中适用于两个矩阵
字符串