Изменено значение в массиве numpy на основе индекса и критериев - PullRequest
0 голосов
/ 28 сентября 2018

У меня есть пустой массив:

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_ и использованием маски subarr < 5 должен возвращать представление массива, а не копию.

Ответы [ 2 ]

0 голосов
/ 28 сентября 2018

Необычное индексирование возвращает копию;следовательно, ваш исходный массив не будет обновлен.Вы можете использовать numpy.where для обновления ваших значений:

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

array([[ 0,  2,  0,  4,  5],
       [ 6,  7,  8,  9, 10]])
0 голосов
/ 28 сентября 2018

Когда вы делаете:

arr[ix] = 0

Интерпретатор Python делает arr.__setitem__(ix, 0), следовательно, изменяет исходный объект.

Во втором случае subarr не зависит от arr, онявляется копией подмножества обр.Затем вы изменяете эту копию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...