#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