#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. Это не работает, если элементы одинаковы в строках, но, тем не менее, спасибо. Это очень помогло.