Сравните массивы разных форм, по строкам, удалите одинаковые значения? - PullRequest
0 голосов
/ 30 июня 2019

Сравните массивы двух разных форм, например:

a:
([[1,2],
[3,4],
[5,6],
[7,8],
[9,10]])

b:
([[3,4],
[5,6]])

c = a -b

ожидаемый результат:

c:
([[1,2],
[7,8],
[9,10]])

Пока то, что я пробовал, обычно приводит к тому, что операнды не могут передаваться вместес формами (21,2) (5,2)

1 Ответ

0 голосов
/ 30 июня 2019

numpy имеет функцию setdiff1d , проблема в том, что она разбивает массивы (так что они становятся 1d), и результат также равен 1d.

с помощью крошечного трюка, используя .view, мы можем заставить numpy думать, что ваши массивы уже 1d, с элементами кортежа, а затем использовать setdiff1d и изменить его после.

попробуйте это:

import numpy as np

a = np.array([[1, 2],
              [3, 4],
              [5, 6],
              [7, 8],
              [9, 10]])

b = np.array([[3, 4],
              [5, 6]])

a_rows = a.view([('', a.dtype)] * a.shape[1])
b_rows = b.view([('', b.dtype)] * b.shape[1])

c = np.setdiff1d(a_rows, b_rows).view(a.dtype).reshape(-1, a.shape[1])

print(c)

Выход:

[[ 1  2]
 [ 7  8]
 [ 9 10]]
...