Python 3.x 在循环矩阵乘法中如何将结果赋给新矩阵
我编写了分别乘以2x3和3x2的两个矩阵的算法。算法运行良好。问题是如何将结果保存到2x2的合成矩阵中 下面是代码Python 3.x 在循环矩阵乘法中如何将结果赋给新矩阵,python-3.x,matrix-multiplication,Python 3.x,Matrix Multiplication,我编写了分别乘以2x3和3x2的两个矩阵的算法。算法运行良好。问题是如何将结果保存到2x2的合成矩阵中 下面是代码 from numpy import * m1 = matrix('1 2 3; 4 5 6') m2 = matrix('7 8; 9 10; 11 12') m4 = matrix('') for k in range(len(m1)): for i in range(len(m1)): m3 = 0 for j in range(le
from numpy import *
m1 = matrix('1 2 3; 4 5 6')
m2 = matrix('7 8; 9 10; 11 12')
m4 = matrix('')
for k in range(len(m1)):
for i in range(len(m1)):
m3 = 0
for j in range(len(m2)):
m3 = m3 + m1[k, j] * m2[j, i]
print(m3)
对于使用列表列表和Numpy数组的矩阵乘法,我们可以使用相同的算法
In [30]: l1 = [[1,2,3],[4,5,6]] ; l2 = [[7,8],[9,10],[11,12]]
In [31]: l3 = [[sum(e1*e2 for e1, e2 in zip(row,col)) for col in zip(*l2)] for row in l1]
In [32]: a1 = np.array(l1) ; a2 = np.array(l2)
In [33]: a3 = [[sum(e1*e2 for e1, e2 in zip(row,col)) for col in zip(*a2)] for row in a1]
In [34]: a3
Out[34]: [[58, 64], [139, 154]]
In [35]: l3
Out[35]: [[58, 64], [139, 154]]
为了进行检查,让我们使用内置矩阵乘法运算符@
In [36]: a1@a2
Out[36]:
array([[ 58, 64],
[139, 154]])
现在,让我们看看如果我们的数据被包装在一个矩阵类中,我们是否可以使用相同的矩阵乘法算法
In [37]: m1 = np.matrix(l1) ; m2 = np.matrix(l2)
In [38]: m3 = [[sum(e1*e2 for e1, e2 in zip(row,col)) for col in zip(*m2)] for row in m1]
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-38-2cd8454aa248> in <module>
----> 1 m3 = [[sum(e1*e2 for e1, e2 in zip(row,col)) for col in zip(*m2)] for row in m1]
<ipython-input-38-2cd8454aa248> in <listcomp>(.0)
----> 1 m3 = [[sum(e1*e2 for e1, e2 in zip(row,col)) for col in zip(*m2)] for row in m1]
<ipython-input-38-2cd8454aa248> in <listcomp>(.0)
----> 1 m3 = [[sum(e1*e2 for e1, e2 in zip(row,col)) for col in zip(*m2)] for row in m1]
<ipython-input-38-2cd8454aa248> in <genexpr>(.0)
----> 1 m3 = [[sum(e1*e2 for e1, e2 in zip(row,col)) for col in zip(*m2)] for row in m1]
~/lib/miniconda3/lib/python3.7/site-packages/numpy/matrixlib/defmatrix.py in __mul__(self, other)
218 if isinstance(other, (N.ndarray, list, tuple)) :
219 # This promotes 1-D vectors to row vectors
--> 220 return N.dot(self, asmatrix(other))
221 if isscalar(other) or not hasattr(other, '__rmul__') :
222 return N.dot(self, other)
ValueError: shapes (1,3) and (1,2) not aligned: 3 (dim 1) != 1 (dim 0)
这个故事的寓意是什么
matrix类具有固有的粘性,这会导致这种特殊的意外行为以及其他不同的意外行为
如果不能确切了解与使用np.matrix()
相关的所有问题,最好的选择是使用np.array
实例化的2D数组
另一方面,如果一个人确切地知道与使用np.matrix()
相关的所有问题,通常他们不想使用np.matrix
,上面说“不再建议使用这个类,即使是线性代数。改为使用正则数组。这个类将来可能会被删除。”-said“
In [37]: m1 = np.matrix(l1) ; m2 = np.matrix(l2)
In [38]: m3 = [[sum(e1*e2 for e1, e2 in zip(row,col)) for col in zip(*m2)] for row in m1]
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-38-2cd8454aa248> in <module>
----> 1 m3 = [[sum(e1*e2 for e1, e2 in zip(row,col)) for col in zip(*m2)] for row in m1]
<ipython-input-38-2cd8454aa248> in <listcomp>(.0)
----> 1 m3 = [[sum(e1*e2 for e1, e2 in zip(row,col)) for col in zip(*m2)] for row in m1]
<ipython-input-38-2cd8454aa248> in <listcomp>(.0)
----> 1 m3 = [[sum(e1*e2 for e1, e2 in zip(row,col)) for col in zip(*m2)] for row in m1]
<ipython-input-38-2cd8454aa248> in <genexpr>(.0)
----> 1 m3 = [[sum(e1*e2 for e1, e2 in zip(row,col)) for col in zip(*m2)] for row in m1]
~/lib/miniconda3/lib/python3.7/site-packages/numpy/matrixlib/defmatrix.py in __mul__(self, other)
218 if isinstance(other, (N.ndarray, list, tuple)) :
219 # This promotes 1-D vectors to row vectors
--> 220 return N.dot(self, asmatrix(other))
221 if isscalar(other) or not hasattr(other, '__rmul__') :
222 return N.dot(self, other)
ValueError: shapes (1,3) and (1,2) not aligned: 3 (dim 1) != 1 (dim 0)
In [39]: m1[0]
Out[39]: matrix([[1, 2, 3]])