基于索引和准则更改numpy数组中的值

2024-05-29 04:32:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个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 < 5都应该返回数组的视图,而不是副本。你知道吗


Tags: numpy视图元素np副本切片数组array
2条回答

花式索引返回一个副本;因此原始数组不会被更新。可以使用^{}更新值:

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

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

当您这样做时:

arr[ix] = 0

python解释器执行arr.__setitem__(ix, 0),因此修改原始对象。你知道吗

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

相关问题 更多 >

    热门问题