Присвойте скалярное значение всем элементам массива numpy, которые находятся в другом массиве - PullRequest
0 голосов
/ 30 ноября 2018

Например, у меня есть массив NumPy a = np.arange(10), и мне нужно присвоить значения в ignore = [2,3,4] как число 255, например:

a = np.arange(10)
ignore_value = [3,4,5]
a[a in ignore_value] = 255 # what is the correct way to implement this?

Последняя строка ввышеприведенная программа не может быть принята Python3.5, но она показывает, что я хочу сделать.

Edit:

Я нашел решение, но оно не векторизовано.

for el in ignore_value:
    a[a == el] = 255

Это выглядит очень некрасиво и очень медленно, так как здесь есть цикл for, так у меня есть лучший способ?

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018

Вы можете использовать numpy.isin с логическим индексированием.

>>> a = np.arange(10)
>>> ignore_value = [3,4,5]
>>> a[np.isin(a, ignore_value)] = 255
>>> a
array([  0,   1,   2, 255, 255, 255,   6,   7,   8,   9])

... или с numpy.where:

>>> a = np.arange(10)
>>> a = np.where(np.isin(a, ignore_value), 255, a)
>>> a
array([  0,   1,   2, 255, 255, 255,   6,   7,   8,   9])

В обоих случаях np.isin(a, ignore_value) даст вам логический массив, указывающий, где a имеет значение, встречающееся в ignore_value.

>>> np.isin(a, ignore_value)
array([False, False, False,  True,  True,  True, False, False, False, False])
0 голосов
/ 30 ноября 2018
In [500]: a = np.arange(10)
In [501]: ignore_value = [3,4,5]
In [502]: np.isin(a, ignore_value)
Out[502]: 
array([False, False, False,  True,  True,  True, False, False, False,
       False])
In [503]: a[np.isin(a, ignore_value)]=255
In [504]: a
Out[504]: array([  0,   1,   2, 255, 255, 255,   6,   7,   8,   9])

Вы также можете создать маску с помощью:

In [506]: a[:,None]==ignore_value
Out[506]: 
array([[False, False, False],
       [False, False, False],
       [False, False, False],
       [ True, False, False],
       [False,  True, False],
       [False, False,  True],
       [False, False, False],
       [False, False, False],
       [False, False, False],
       [False, False, False]])
In [507]: (a[:,None]==ignore_value).any(axis=1)
Out[507]: 
array([False, False, False,  True,  True,  True, False, False, False,
       False])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...