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