![](/img/trans.png)
[英]Is there a difference between np.matrix(np.array([0,0])) and np.matrix([0,0])?
[英]What is the difference between using matrix multiplication with np.matrix arrays, and dot()/tensor() with np.arrays?
目前,我的代码完全使用numpy数组编写, np.array
。
将m
定义为100个值的m.shape = (100,)
, m.shape = (100,)
。 还有一个多维数组, C.shape = (100,100)
。
我想要计算的操作是
m^T * C * m
其中m^T
应为形状(1,100)
, m
为形状(100,1)
, C
为形状(100,100)
。
我对如何继续进行了冲突。 如果我坚持数据类型必须保留np.arrays
,那么我应该numpy.dot()
或numpy.tensordot()
并指定轴。 那会是这样的
import numpy as np
result = np.dot(C, m)
final = np.dot(m.T, result)
虽然mT
是一个与m
相同形状的数组。 此外,这是两个单独的操作,而不是一个。
否则,我应该将所有内容转换为np.matrix
并继续使用矩阵乘法。 这个问题是我必须将我的所有np.arrays
转换为np.matrix
,执行操作,然后转换回np.array
。
什么是最有效和最聪明的事情?
编辑:
基于到目前为止的答案,我认为np.dot(m^T, np.dot(C, m))
可能是最好的前进方式。
使用矩阵的主要优点是*
符号执行矩阵乘法,而它执行与数组的逐元素乘法。 对于数组,您需要使用dot
。 请参阅: http : //wiki.scipy.org/NumPy_for_Matlab_Users numpy数组和矩阵之间有什么区别? 我应该使用哪一个?
如果m
是一维数组, 则不需要转置任何内容 ,因为对于1D数组,转置不会改变任何内容:
In [28]: m.T.shape, m.shape
Out[28]: ((3,), (3,))
In [29]: m.dot(C)
Out[29]: array([15, 18, 21])
In [30]: C.dot(m)
Out[30]: array([ 5, 14, 23])
如果您向m
添加另一个维度,则会有所不同:
In [31]: mm = m[:, np.newaxis]
In [32]: mm.dot(C)
--------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-32-28253c9b8898> in <module>()
----> 1 mm.dot(C)
ValueError: objects are not aligned
In [33]: (mm.T).dot(C)
Out[33]: array([[15, 18, 21]])
In [34]: C.dot(mm)
Out[34]:
array([[ 5],
[14],
[23]])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.