Проверьте, являются ли элементы массива исключительными для других множественных массивов. - PullRequest
0 голосов
/ 04 февраля 2019

Из того, что я знаю, элементы в массиве numpy пакета можно различить с помощью функции np.isin.

Например:

In:
A = np.array([1,2,3,4,5])
B = np.array([6,7,8,9,1])
C = np.array([6,7,1,2,4])
~np.isin(A , [B, C])

Out:
array([ False, False, True, False, True])

В этом случае, так как 3 и 5 donне существует ни в одном из этих сравниваемых массивов, я понимаю, что вывод будет выполнен, как показано выше.

Но если я сделаю это немного по-другому, как это:

In:
A = np.array([1,2,3,4,5])
B = np.array([6,7,8,9,1,3])
C = np.array([6,7,1,2,4])
~np.isin(A , [B, C])

Out:
array([ True,  True,  True,  True,  True])

Вместо того, чтоЯ ожидал:

array([False, False, False, False,  True])

После теста я знал, что размещение np.nan в массиве C будет работать нормально.

Но есть ли эффективный способ проверить, если элементыв массиве A нет в других массивах, чьи формы отличаются?

1 Ответ

0 голосов
/ 04 февраля 2019

Я подозреваю, что проблема в том, как вы передаете второй параметр [B, C]. docs скажем

Значения, по которым проверяется каждое значение элемента.Этот аргумент выравнивается, если это массив или array_like.См. Примечания о поведении с параметрами, не похожими на массивы.

А примечания:

element и test_elements преобразуются в массивы, если их еще нет,Если test_elements является set (или другой непоследовательной коллекцией), он будет преобразован в массив объектов с одним элементом, а не в массив значений, содержащихся в test_elements.Это является следствием способа конструктора массива обрабатывать непоследовательные коллекции.Преобразование набора в список обычно дает желаемое поведение.

В данном случае это означает, что первый пример, содержащий B и C равной длины, будет правильно интерпретирован как2D массив целых чисел (который затем равняется 1D).Во втором примере B и C имеют разные размеры.Поскольку вы не можете иметь рваный массив, результатом становится массив объектов, содержащий два элемента, каждый из которых является массивом.Поскольку ни один из ваших A элементов не является массивом, все сравнения: False.

Обходной путь - правильно построить ожидаемый ввод:

np.isin(A, np.concatenate((B, C)), invert=True)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...