首页 > 解决方案 > 为什么在布尔过滤数组中切片没有发生..?

问题描述

当我尝试对布尔过滤的 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] 索引更改为索引时,它并没有改变它的值...如何在布尔过滤器中更改这些值。?

标签: python-3.xpandasnumpynumpy-ndarraynumpy-slicing

解决方案


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]评估作为单独的 get 和 set 操作。


推荐阅读