2

例如,如何在不复制矩阵对象的情况下进行矩阵转置?同样,与其他矩阵运算一样(从矩阵中减去一个矩阵,...)。这样做有好处吗?

4

2 回答 2

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)
于 2013-05-06T20:43:52.940 回答
4

转置操作如b = a.T创建一个浅拷贝。 a并将b共享相同的数据。

对于算术运算,请参阅:- vs -= 带有 numpy 的运算符

浅拷贝有利于有效地使用内存。但是您必须记住,更改值将影响所有副本。

于 2013-05-06T20:44:40.330 回答