我正在尝试将一些Matlab代码翻译成Python(使用numpy)。我有以下Matlab代码:
(1/x)*eye(2)
X只是1000000.据我所知,* Matlab中的*表示矩阵乘法,而等价的是.dot中的numpy。所以在Python中,我有:
numpy.array([(1/x)]).dot(numpy.identity(2))
我得到错误"形状(1,)和(2,2)未对齐:1(暗0)!= 2(暗0)"当我尝试运行numpy代码时。
显然我不理解某事。有谁知道适当的numpy代码是什么?
答案 0 :(得分:4)
由于x
是标量,如果在矩阵中将矩阵乘以标量,它只需按该值缩放所有条目。不需要矩阵乘法。
如果你想在numpy
中实现同样的功能,你可以在MATLAB中执行相同的操作:
(1/x)*numpy.identity(2)
如果x
是兼容维度的矩阵,那么您使用numpy.dot
:
(1/x).dot(numpy.identity(2))
因此,在决定进行操作之前,您需要确保知道x
是什么。
numpy
使用*
运算符执行逐元素乘法,因此如果您想要实际的矩阵乘法,请使用numpy.dot
。您的尺寸不兼容,因为标量和矩阵之间的真正矩阵乘法是不可能的。
答案 1 :(得分:1)
基本上在numpy操作中*和点不同。
(*)执行逐元素运算–每个矩阵元素与其他矩阵对应元素
a.dot(c)–执行实际的数学矩阵乘法,这是我们在高中时期研究的。
a = np.arange(9).reshape(3,3)
b = np.arange(10,19).reshape(3,3)
In [47]: a*b
Out[47]:
array([[ 0, 11, 24],
[ 39, 56, 75],
[ 96, 119, 144]])
In [48]: a.dot(b)
Out[48]:
array([[ 45, 48, 51],
[162, 174, 186],
[279, 300, 321]])