【问题标题】:Numpy matrix modified through a copy通过副本修改的numpy矩阵
【发布时间】:2012-05-27 04:34:10
【问题描述】:

在带有 numpy 1.5.1 的 python 2.7.1 中:

import numpy as np

B = np.matrix([[-float('inf'), 0], [0., 1]])
print B
Bm = B[1:, :]
Bm[:, 1] = float('inf')
print B

返回

[[-inf   0.]
 [  0.   1.]]
[[-inf   0.]
 [  0.  inf]]

这很出人意料,因为我认为 Bm 是一个副本(如this question)。

任何解决此问题的帮助将不胜感激。

【问题讨论】:

  • 请注意,-float('inf') 更直接的是float('-inf'),它的好处是不需要计算(取数字的反面)。
  • 另请注意,矩阵创建中0. 中的点也不需要:float('inf') 的存在保证矩阵至少是浮点类型。

标签: python numpy


【解决方案1】:

在我的问题中,是 np.append 制作了副本。切片不会复制数组/矩阵。

你可以用Bm复制一份

Bm = B[1:, :].copy()

【讨论】:

    【解决方案2】:

    Basic slicing 在 numpy 中返回一个视图,而不是切片 Python 列表,后者复制它们。

    但是,如果使用高级切片,切片将总是复制数据,就像连接或附加 numpy 数组一样。

    比较

    a = np.arange(16).reshape((4,4))
    a_view = a[::2, ::3]  # basic slicing
    a_copy = a[[0, 2], :]  # advanced
    

    【讨论】:

      【解决方案3】:

      这很有趣,就像 jorgeca 的例子:

      a = np.arange(16).reshape((4,4))
      a_view = a[::2, ::3]  # basic slicing
      a_copy = a[[0, 2], :]  # advanced
      

      我的附加评论可能跑题了,但令人惊讶的是以下两条

      a[::2, ::3]+= 1  # basic slicing
      a[[0, 2], :]+= 1 # advanced
      

      将对a进行更改。

      【讨论】:

        猜你喜欢
        • 2022-11-02
        • 1970-01-01
        • 1970-01-01
        • 2022-10-16
        • 2016-01-08
        • 2016-07-31
        • 2020-03-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多