【问题标题】:NumPy Matrix operation without copying无需复制的 NumPy 矩阵运算
【发布时间】:2023-03-29 15:34:01
【问题描述】:

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

【问题讨论】:

    标签: python numpy


    【解决方案1】:

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

    >>> 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 上)。当xnp.dot 的参数之一时,我一直无法使用np.dot(..., out=x)。但是,您的回答对于我能想到的任何其他 numpy 函数都是正确的,我不确定为什么 np.dot 很特别。也许其他人可以解决这一点。
    • 有趣。可能是版本问题。我在 Red Hat Linux 6.3 上运行了如上所示的命令,它对我有用(我不记得手头的 numpy 版本,但我会检查)。它也适用于带有 numpy 1.7 的 OS X 10.6。
    • 好奇,你介意试试a = np.ones((4, 4)); np.dot(a, a, out=a); print a 告诉我你得到了什么吗?
    • 刚刚在 OS X 上查看了结果 - 令人惊讶的是 - 输出全为零。感谢您指出了这一点。我修改了我的答案,将结果写入不同的数组。明天我将在 RHEL 6.3 上尝试这个,并让你知道我在那里得到了什么。
    • 使用 numpy 1.6.2 的 RHEL 上的输出也全为零。如果我不得不猜测,我猜输出数组在累积行/列产品之前是零填充的,但是由于输出是输入之一,因此结果始终为零。我确实验证了np.add(a, a, out=a) 确实产生了预期的输出。
    【解决方案2】:

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

    算术运算参见:- vs -= operators with numpy

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-08-13
      • 2013-08-18
      • 2017-09-26
      • 1970-01-01
      • 2015-08-01
      • 2015-10-02
      • 1970-01-01
      • 2013-05-04
      相关资源
      最近更新 更多