Как сделать этот вид массива равенства быстрым (в numpy)? - PullRequest
5 голосов
/ 02 декабря 2011

У меня есть два массива numpy (2-мерные), например

a1 = array([["a","b"],["a","c"],["b","b"],["a","b"]])
a2 = array([["a","b"],["b","b"],["c","a"],["a","c"]])

Какой самый элегантный способ получить матрицу, подобную этой:

array([[1,0,0,0],
       [0,0,0,1],
       [0,1,0,0],
       [1,0,0,0]])

Где элемент (i, j) равен 1, если все (a1 [i ,:] == a2 [j ,:]) и в противном случае 0

(все, что включает два цикла for, я не считаю элегантным)

1 Ответ

10 голосов
/ 02 декабря 2011
>>> (a1[:,numpy.newaxis] == a2).all(axis=2)
array([[ True, False, False, False],
       [False, False, False,  True],
       [False,  True, False, False],
       [ True, False, False, False]], dtype=bool)

Если вам действительно нужны целые числа, преобразуйте в int в качестве последнего шага:

>>> (a1[:,numpy.newaxis] == a2).all(axis=2).astype(int)
array([[1, 0, 0, 0],
       [0, 0, 0, 1],
       [0, 1, 0, 0],
       [1, 0, 0, 0]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...