Как получить элементы и индексы в исходный массив с маской - PullRequest
2 голосов
/ 14 апреля 2020

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

import numpy as np

arr1 = np.array([0.00, 0.016, 0.033, 0.050, 0.067])
arr2 = np.array([0.016, 0.033, 0.050, 0.067, 0.083])

ind = np.intersect1d(np.where(arr1 >= 0.01), np.where(arr2 >= 0.01))

Печать ind показывает array([1, 2, 3, 4]). Технически, я хочу элементы 1, 2, 3, 4 из arr1 и элементы 0, 1, 2, 3 из arr2, что дает элементы 0.016, 0.033, 0.050, 0.067, которые совпадают в обоих массивах.

1 Ответ

2 голосов
/ 15 апреля 2020

np.where преобразует логическую маску, такую ​​как arr1 >= 0.01, в индекс. Вы можете выбрать маску напрямую, но она не будет обратимой. Вам нужно инвертировать индексы, потому что вы хотите пересечь исходный массив, а не выделение. Обязательно установите return_indices=True для получения индексов от intersect1d:

index1 = np.nonzero(arr1 >= 0.01)
index2 = np.nonzero(arr2 >= 0.01)
selection1 = arr1[index1]
selection2 = arr2[index1]

elements, ind1, ind2 = np.intersect1d(selection1, selection2, return_indices=True)

index1 = index1[ind1]
index2 = index2[ind2]

Пока вы получаете elements непосредственно от пересечения, индексы ind1 и ind2 ссылаются на маскированные выборки. Поскольку index1 является исходным индексом каждого элемента в selection1, index1[ind1] преобразует ind1 обратно в arr1 систему отсчета.

Ваше первоначальное выражение было фактически бессмысленным. Вы пересекали индексы в каждом массиве, который соответствовал вашему условию. Это не имеет ничего общего со значениями в этих индексах (которые вообще не должны совпадать). Казалось бы, правильный результат - просто совпадение, основанное на случайной конструкции массива.

...