在numpy中将多个矩阵相乘

e4yzc0pl  于 11个月前  发布在  其他
关注(0)|答案(6)|浏览(115)

假设你有n个方阵A1,...,An.有没有办法用一种简洁的方式来乘这些矩阵?据我所知,numpy中的点只接受两个参数。一个明显的方法是定义一个函数来调用它自己并得到结果。有没有更好的方法来完成它?

bis0qfac

bis0qfac1#

这可能是一个相对较新的功能,但我喜欢:

A.dot(B).dot(C)

字符串
或者如果你有一个长链,你可以这样做:

reduce(numpy.dot, [A1, A2, ..., An])


更新:
这里有更多关于reduce的信息。这里有一个例子可能会有帮助。

>>> 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


2016年更新:从python 3.5开始,有一个新的matrix_multiply符号,@

R = A @ B @ C

bqjvbblv

bqjvbblv2#

更新一个老问题:
November 13, 2014开始,现在有一个np.linalg.multi_dot函数可以完全满足你的需要,它还可以优化调用顺序,尽管在你的情况下这不是必需的。
请注意,这从numpy 1.10版本开始可用。

fnvucqvd

fnvucqvd3#

如果你事先计算所有的矩阵,那么你应该使用一个优化方案来进行矩阵链乘法。参见this Wikipedia article

db2dz4w8

db2dz4w84#

另一种方法是使用einsum,它为NumPy实现了Einstein summation convention
简单地解释一下这个问题的约定:当你把你的多矩阵乘积写成一个大的乘积和时,你会得到这样的结果:

P_im = sum_j sum_k sum_l A1_ij A2_jk A3_kl A4_lm

字符串
其中P是乘积的结果,A1A2A3A4是输入矩阵。请注意,您对在被加数中出现两次的索引进行求和,即jkl。由于具有此属性的和经常出现在物理学中,向量微积分,可能还有其他一些字段,有一个NumPy工具,即einsum
在上面的例子中,你可以用它来计算你的矩阵乘积,如下所示:

P = np.einsum( "ij,jk,kl,lm", A1, A2, A3, A4 )


这里,第一个参数告诉函数哪些索引应用于参数矩阵,然后对所有双重出现的索引求和,产生所需的结果。
请注意,计算效率取决于几个因素(所以你可能最好只测试它):

3yhwsihp

3yhwsihp5#

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)

字符串

ix0qys7i

ix0qys7i6#

这在VS代码中适用于两个矩阵

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

字符串

相关问题