Подтвердить что ты не робот

NumPy, измените значения, которые НЕ входят в список индексов

У меня есть массив numpy, например:

a = np.arange(30)

Я знаю, что я могу заменить значения, расположенные в позициях indices=[2,3,4], используя, например, фантазийное индексирование:

a[indices] = 999

Но как заменить значения на позиции, которые не находятся в indices? Было бы что-то вроде ниже?

a[ not in indices ] = 888

Спасибо!

4b9b3361

Ответ 1

Я не знаю чистого способа сделать что-то вроде этого:

mask = np.ones(a.shape,dtype=bool) #np.ones_like(a,dtype=bool)
mask[indices] = False
a[~mask] = 999
a[mask] = 888

Конечно, если вы предпочитаете использовать тип данных numpy, вы можете использовать dtype=np.bool_ - не будет никакой разницы в выходе. это просто вопрос предпочтения.

Ответ 2

Работает только для 1-го массива:

a = np.arange(30)
indices = [2, 3, 4]

ia = np.indices(a.shape)

not_indices = np.setxor1d(ia, indices)
a[not_indices] = 888

Ответ 3

Очевидно, что для множеств нет общего оператора not. Ваш выбор:

  • Вычитает ваш indices набор из универсального набора индексов (зависит от формы a), но это будет немного сложно реализовать и прочитать.
  • Некоторая итерация (возможно, for -loop - ваш лучший выбор, поскольку вы определенно хотите использовать тот факт, что ваши индексы отсортированы).
  • Создание нового массива, заполненного новым значением, и выборочное копирование индексов из старого.

    b = np.repeat(888, a.shape)
    b[indices] = a[indices]
    

Ответ 4

Просто преодолеть подобную ситуацию, решить этот путь:

a = np.arange(30)
indices=[2,3,4]

a[indices] = 999

not_in_indices = [x for x in range(len(a)) if x not in indices]

a[not_in_indices] = 888