【发布时间】:2023-03-29 15:34:01
【问题描述】:
如何在不复制矩阵对象的情况下进行例如矩阵转置?同样,与其他矩阵运算一样(从矩阵中减去一个矩阵,...)。这样做有好处吗?
【问题讨论】:
如何在不复制矩阵对象的情况下进行例如矩阵转置?同样,与其他矩阵运算一样(从矩阵中减去一个矩阵,...)。这样做有好处吗?
【问题讨论】:
对数组进行转置不会产生副本:
>>> 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)
【讨论】:
aa = numpy.dot(a, a, out=a) 不起作用(在带有 numpy 1.6 的 Linux 上)。当x 是np.dot 的参数之一时,我一直无法使用np.dot(..., out=x)。但是,您的回答对于我能想到的任何其他 numpy 函数都是正确的,我不确定为什么 np.dot 很特别。也许其他人可以解决这一点。
a = np.ones((4, 4)); np.dot(a, a, out=a); print a 告诉我你得到了什么吗?
np.add(a, a, out=a) 确实产生了预期的输出。
b = a.T 中的转置操作会创建一个浅拷贝。 a 和 b 将共享相同的数据。
算术运算参见:- vs -= operators with numpy
浅拷贝有利于有效地使用内存。但是您必须记住,更改值会影响所有副本。
【讨论】: