繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM