Python 无复制的NumPy矩阵运算

Python 无复制的NumPy矩阵运算,python,numpy,Python,Numpy,例如,我如何在不复制矩阵对象的情况下进行矩阵转置?以及其他矩阵运算(从矩阵中减去矩阵,…)。这样做有益吗?对数组进行转置不会产生副本: >>> 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],

例如,我如何在不复制矩阵对象的情况下进行矩阵转置?以及其他矩阵运算(从矩阵中减去矩阵,…)。这样做有益吗?

对数组进行转置不会产生副本:

>>> 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)

b=a.T
中的转置操作创建浅拷贝<代码>a和
b
将共享相同的数据

有关算术运算,请参见:


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

回答得好,只是一个小提示
aa=numpy.dot(a,a,out=a)
不起作用(在使用numpy 1.6的linux上)。当
x
np.dot
的参数之一时,我在使用
np.dot(…,out=x)
时总是遇到问题。然而,你的答案对于我能想到的任何其他numpy函数都是正确的,我不确定为什么
np.dot
是特殊的。也许其他人可以解决这个问题。很有趣。也许这是一个版本问题。我在Red Hat Linux 6.3上运行了如上所示的命令,它对我很有效(我现在还不记得numpy版本,但我会检查一下)。我在OS X 10.6和numpy 1.7上也可以使用它。好奇,你介意试试
a=np.ones((4,4));np.dot(a,a,out=a);打印一个
并告诉我你得到了什么?只是在OSX上查看了一个结果,结果竟然是全零。谢谢你指出这一点。我修改了我的答案,将结果写入另一个数组。明天我将在RHEL 6.3上尝试这个,并让您知道我在那里得到了什么。如果必须猜测的话,我会猜测输出数组在累加行/列乘积之前是零填充的,但是由于输出是输入之一,因此结果总是相同的零。我确实验证了
np.add(a,a,out=a)
确实产生了预期的输出。