Python Извлекает строки, не находящиеся в другом массиве numpy

#python #numpy

Вопрос:

Учитывая две матрицы numpy » a » и «b», я пытаюсь извлечь строки в «a», которых нет в «b». Проблема в том, что размерность » b » не фиксирована. Если я использую .tolist() , то он не работает, когда » b «имеет размерность = 1, так как он рассматривает каждую строку с отдельными элементами» b «вместо всего массива «b».

Вот результаты некоторых функций, которые я пробовал: Ссылка на изображение

На изображении первый и последний результат верен. Если » b » является матрицей, то преобразование в список работает, но если это массив, то .all().any() работает.

np.isin() также не работает, так как «а» многомерно.

Каков общий способ достижения этой цели?

Комментарии:

1. c имеет форму (1,) нет (1, 3) . Вы это заметили?

2. Извините, моя ошибка, я хотел сказать, c (3, ) не в форме (1, 3)

3. ДА. У меня был и оттуда я сделал вывод .tolist() , почему не работает

Ответ №1:

np.isin на самом деле работает, и правильный способ сделать это так:

 gt;gt;gt; a = np.arange(1, 10).reshape(3,3) gt;gt;gt; a array([[1, 2, 3],  [4, 5, 6],  [7, 8, 9]]) gt;gt;gt; b array([[1, 2, 3],  [4, 5, 6]]) gt;gt;gt; c = np.arange(1, 4).reshape(1, 3) gt;gt;gt; c array([[1, 2, 3]])  

Тогда элементы в a не в b являются:

 gt;gt;gt; a[~np.isin(a,b)].reshape(-1, a.shape[1]) array([[7, 8, 9]])  

Элементы в a не в c являются (при условии, что количество столбцов одинаково в обеих матрицах):

 gt;gt;gt; a[~np.isin(a,c)].reshape(-1, a.shape[1]) array([[4, 5, 6],  [7, 8, 9]])  

Комментарии:

1. Спасибо. Я скучал по этой попытке. Большое спасибо,

2. Это не работает, если элементы одинаковы в строках, но, тем не менее, спасибо. Это очень помогло.