【问题标题】:Changed value in numpy array based on index and on criteria根据索引和条件更改 numpy 数组中的值
【发布时间】:2019-03-04 13:42:09
【问题描述】:

我有一个 numpy 数组:

arr = np.array([[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]])

>> arr
[[ 1  2  3  4  5]
 [ 6  7  8  9 10]]

我想根据索引(不是切片)获取数组的一部分:

ix = np.ix_([0, 1], [0, 2])
>> arr[ix]

[[1 3]
 [6 8]]

并且我想修改原始数组中的那些元素,如果我这样做会起作用:

arr[ix] = 0
>> arr
[[ 0  2  0  4  5]
 [ 0  7  0  9 10]]

但我只想在它们遵循特定条件时更改它们,例如它们小于5。我正在尝试这个:

subarr = arr[ix]
subarr[subarr < 5] = 0

但它并没有修改原来的。

>> arr
[[ 1  2  3  4  5]
 [ 6  7  8  9 10]]

>> subarr
[[0 0]
 [6 8]]

我不确定为什么这不起作用,因为使用 np.ix_ 通过索引访问数组和使用掩码 subarr &lt; 5 都应该返回数组的视图,而不是副本。

【问题讨论】:

  • 提示:查看 arr[ix][arr[ix]
  • @ColonelBeauvel 这不会改变 arr 值。
  • 我不是说这个,只是看维度似乎不是同一个对象。因此,我怀疑没有引用 arr 。还在寻找答案。
  • @ColonelBeauvel 你在说什么?
  • stackoverflow.com/a/21502377/5625981 这个答案解释了如果使用“花式索引”,numpy 总是返回一个副本。

标签: python arrays python-2.7 numpy indexing


【解决方案1】:

花式索引返回一个副本;因此您的原始数组将不会被更新。您可以使用numpy.where 更新您的值:

arr[ix] = np.where(arr[ix] < 5, 0, arr[ix])

array([[ 0,  2,  0,  4,  5],
       [ 6,  7,  8,  9, 10]])

【讨论】:

  • 太棒了。我想这里的技巧是使用左值索引来使分配有效,正如here 解释的那样。
  • @ColonelBeauvel,对不起。我没有看到你的帖子
【解决方案2】:

当你这样做时:

arr[ix] = 0

python 解释器执行arr.__setitem__(ix, 0) 从而修改原始对象。

在第二种情况下,subarr 独立于 arr,它是 arr 子集的副本。然后你修改这个副本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多