如何制作矩阵转置,而不制作矩阵对象的副本?同样,作为其他矩阵运算(从矩阵中减去矩阵,......)。这样做有益吗?
答案 0 :(得分:10)
进行数组的转置不会复制:
>>> a = np.arange(9).reshape(3,3)
>>> b = np.transpose(a)
>>> a
array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
>>> b
array([[0, 3, 6],
[1, 4, 7],
[2, 5, 8]])
>>> b[0,1] = 100
>>> b
array([[ 0, 100, 6],
[ 1, 4, 7],
[ 2, 5, 8]])
>>> a
array([[ 0, 1, 2],
[100, 4, 5],
[ 6, 7, 8]])
同样适用于numpy.matrix对象。
如果您希望通过复制非常大的数组来避免不必要地占用大量内存,那么可以。但是在修改转置时,你还必须小心避免无意中修改原始数组(如果你仍然需要它)。
许多numpy函数接受一个可选的“out”关键字(例如,numpy.dot)来将输出写入现有数组。例如,要将a
的矩阵乘积与自身对齐,并将输出写入现有数组c
:
numpy.dot(a, a, out=c)
答案 1 :(得分:4)
b = a.T
中的转置操作会创建浅表副本。 a
和b
将共享相同的数据。
对于算术运算,请参阅:- vs -= operators with numpy
浅拷贝有利于有效地使用内存。但是,您必须记住,更改值将影响所有副本。