Индексирование с помощью двух логических массивов в NumPy

#python #arrays #numpy #indexing

#python #массивы #numpy #индексирование

Вопрос:

У меня есть некоторые данные в массиве numpy, а затем я хочу выбрать подмножество подмножества и обновить эти значения.

Допустим, первый массив, A, содержит N элементов. Затем я использую логический массив mask1 с N элементами в качестве маски для выбора первого подмножества. Затем я использую второй логический массив mask2 с элементами sum(mask1), чтобы выбрать подмножество первого подмножества. Но когда я пытаюсь обновить эти значения, они не сохраняются в исходном массиве.

Пример кода:

 N = 10
A = np.arange(N)

# Create mask of size N, with only some True values
mask1 = np.zeros(N, dtype = np.bool)
mask1[:7] = True

# Create mask of size (sum(mask1)), with only some True values
mask2 = np.zeros(np.sum(mask1), dtype = np.bool)
mask2[2:] = True

# Indexing with both masks works as expected:
print(A[mask1][mask2])
  

Это выводит

 [2 3 4 5 6]
  

как и ожидалось. Но когда я пытаюсь обновить значения, проиндексированные таким образом, это не работает.

 # Trying to update those values does not work:
A[mask1][mask2] = -1
print(A)
  

При этом выводится исходный неизмененный массив:

 [0 1 2 3 4 5 6 7 8 9]
  

Если я выполняю индексацию только с одним логическим массивом, значения обновляются, так что это возможный обходной путь. Однако я реализую алгоритм для физического процесса, в котором действительно естественно сначала создать одну маску, подмножество по одному критерию, а затем подмножество, основанное на других критериях, поэтому было бы действительно элегантно, если бы я мог заставить это работать.

Ответ №1:

Более производительный вариант был бы с цепной маскировкой

 mask1[mask1] = mask2
A[mask1] = -1
  

Не такой производительный —

 A[np.flatnonzero(mask1)[mask2]] = -1