目前,我的代码完全使用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.arrays
或numpy.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
可能是最好的前进方式。
答案 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]])