为什么在布尔过滤数组中切片没有发生......?

Why slicing in boolean filtered array is not happening..?

当我尝试对布尔过滤的 numpy 数组进行切片时,它并没有改变它的值。 请看

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

数组([2, 3, 4, 5, 6, 7, 8])

array = np.array([1,2,3,4,5,6,7,8])
array[array>=2][1:5]

数组([3, 4, 5, 6])

array = np.array([1,2,3,4,5,6,7,8])
array[array>=2][1:5] = [1,1,1,1]
array

数组([1, 2, 3, 4, 5, 6, 7, 8])

当我将 [1:5] 索引更改为 ones 时,它并没有改变它的值...如何在布尔过滤器中更改这些值?

In [246]: arr = np.arange(1,9)
In [247]: mask = arr>=2
In [248]: mask
Out[248]: array([False,  True,  True,  True,  True,  True,  True,  True])

arr[mask] 创建一个新数组,一个副本(不是视图)。可以滑动修改,但不影响arr.

相反,您必须修改 mask 或从中派生的索引。

一种方式:

In [249]: idx = np.nonzero(mask)[0]
In [250]: idx
Out[250]: array([1, 2, 3, 4, 5, 6, 7])
In [251]: arr[idx[1:5]]
Out[251]: array([3, 4, 5, 6])
In [252]: arr[idx[1:5]] = 1
In [253]: arr
Out[253]: array([1, 2, 1, 1, 1, 1, 7, 8])

[252] 只有一个索引操作,所以赋值有效。

如果需要,我可以讨论 array[array>=2][1:5] = [1,1,1,1] 如何评估为单独的获取和设置操作。