Почему нарезка в массиве с логической фильтрацией не происходит ..?

#python-3.x #pandas #numpy #numpy-ndarray #numpy-slicing

#python-3.x #панды #numpy #numpy-ndarray #numpy-нарезка

Вопрос:

Когда я пытаюсь нарезать массив 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] на единицы, он не меняет своего значения … Как я могу изменить это значение в логическом фильтре.?

Комментарии:

1. Как только вы используете логический индекс, вы работаете с новым массивом, содержащим эти элементы, а не с исходным массивом. Вам нужно сохранить новый массив как переменную, иначе вы будете записывать новые значения, но впоследствии не сможете получить к ним доступ.

Ответ №1:

 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] вычисляется как отдельные операции получения и установки, если это необходимо.