我正在翻译一些MATLAB代码,并且在理解MATLAB和numpy for Python之间的语法差异方面遇到了一些问题。
在MATLAB中,我有一个6乘6的矩阵A,以及6个浮点值a,b,c,d,e,f。 MATLAB代码
B = A*[a;b;c;d;e;f];
生成一个6乘1矩阵,B。 所以我认为MATLAB运算符'*'必须对应于numpy运算符numpy.dot()。
所以在我的Python代码中,我有相同的矩阵,A和a,b,c,d,e和f的相同值。
B = numpy.dot(A, [[a],[b],[c],[d],[e],[f]])
不生成相同的矩阵,B,也不生成
B = numpy.dot(A, [a,b,c,d,e,f])
我也尝试使用numpy的数组函数构建Python矩阵和数组,结果相同。 感觉就像我在这里混合一些基本的东西。非常感谢任何帮助。
答案 0 :(得分:3)
如果不知道A
和a,b,c,d,e,f
中的值,就很难完全回答。但是,您的代码似乎有效:
MATLAB:
A = [1,2,3,4,5,6;
1,2,3,4,5,6;
1,2,3,4,5,6;
1,2,3,4,5,6;
1,2,3,4,5,6;
1,2,3,4,5,6];
b = [7;8;9;10;11;12];
A*b
ans =
217
217
217
217
217
217
A'*b
ans =
57
114
171
228
285
342
的Python:
import numpy as np
A = np.array([[1,2,3,4,5,6],
[1,2,3,4,5,6],
[1,2,3,4,5,6],
[1,2,3,4,5,6],
[1,2,3,4,5,6],
[1,2,3,4,5,6]])
b = np.array([7,8,9,10,11,12]).reshape(6, 1)
B = np.dot(A, b)
B
array([[217],
[217],
[217],
[217],
[217],
[217]])
B = np.dot(A.transpose(), b)
B
array([[57],
[114],
[171],
[228],
[285],
[342]])
numpy dot
运算符会执行矩阵乘法运算,因此您初始化A
时可能会出现问题,但您无法显示。
请注意,reshape
操作不是必需的(无论如何都会看到相同的结果)。但是,这会产生一个列向量而不是一维数组,因此可以以与MATLAB数组[7;8;9;10;11;12]
相同的方式进行转置等。
答案 1 :(得分:0)
您乘以的向量是一列,因此将其用作列以获得最终的6x1向量而不是1x6向量,因为您在MATLAB中执行6x6乘6x1的点积。
此示例适用于3x3维度(只是为了减少代码并且可以理解):
import numpy as np
A = np.array([[8,1,6],[3,5,7],[4,9,2]]) # This is the matrix
b = np.array([1,2,3]) # These are the float numbers
c = np.dot(A,b.reshape(-1,1)) # This is a 3x1 vector
这相当于MATLAB:
magic(3)*[1;2;3]