根据索引和条件更改numpy数组中的值

时间:2018-09-28 14:21:23

标签: python arrays python-2.7 numpy indexing

我有一个numpy数组:

isPopupOpened = false

我想基于索引(而不是切片)获取数组的一部分:

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_来访问数组都应返回数组的视图,而不是副本。

2 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:0)

当您这样做:

arr[ix] = 0

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

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