NumPy, измените значения, которые НЕ входят в список индексов
У меня есть массив numpy
, например:
a = np.arange(30)
Я знаю, что я могу заменить значения, расположенные в позициях indices=[2,3,4]
, используя, например, фантазийное индексирование:
a[indices] = 999
Но как заменить значения на позиции, которые не находятся в indices
? Было бы что-то вроде ниже?
a[ not in indices ] = 888
Спасибо!
Ответы
Ответ 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