使用矩阵乘法与np.matrix数组和dot()/ tensor()与np.arrays有什么区别?

时间:2015-06-23 20:42:22

标签: python arrays numpy matrix

目前,我的代码完全使用numpy数组np.array编写。

m定义为100个值的{np.array,m.shape = (100,)。还有一个多维数组,C.shape = (100,100)

我想要计算的操作是

m^T * C * m 

其中m^T的形状(1,100),形状m的{​​{1}}和形状(100,1)的{​​{1}}应该是C

我对如何处理感到矛盾。如果我坚持数据类型必须保持(100,100),那么我应该np.arraysnumpy.dot()并指定轴。这就像是

numpy.tensordot()

虽然import numpy as np result = np.dot(C, m) final = np.dot(m.T, result) 是一个与m.T形状相同的数组。此外,这是两个单独的操作,而不是一个。

否则,我应该将所有内容转换为m并继续使用矩阵乘法。这个问题是我必须将所有np.matrix转换为np.arrays,执行操作,然后转换回np.matrix

最有效率和最聪明的事情是什么?

编辑:

根据目前为止的答案,我认为np.array可能是最好的前进方式。

1 个答案:

答案 0 :(得分:0)

使用矩阵的主要优点是*符号执行矩阵乘法,而它使用数组执行逐元素乘法。对于数组,您需要使用dot。看到: http://wiki.scipy.org/NumPy_for_Matlab_Users What are the differences between numpy arrays and matrices? Which one should I use?

如果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]])