Сравнение более двух массивов NumPy - PullRequest
0 голосов
/ 31 августа 2018

Я хочу иметь логический массив NumPy fixidx, который является результатом сравнения массивов NUMPY a, b, c и d. Например у меня есть массивы

a = np.array([1, 1])
b = np.array([1, 2])
c = np.array([1, 3])
d = np.array([1, 4])

поэтому массив fixidx имеет значения

fixidx = [1, 0]

Мой подход был

fixidx = (a == b) & (b == c) & (c == d)

Это работает в Matlab, но, как оказалось, Python выдает только ValueError.

ValueError: Значение истинности массива с более чем одним элементом неоднозначно. Используйте a.any () или a.all ()

any или all не сработают, или, по крайней мере, я не смог этого понять.

Ответы [ 2 ]

0 голосов
/ 31 августа 2018

Давайте начнем с объединения a, b, c и d в один массив x:

In [452]: x = np.stack([a, b, c, d])

In [453]: x
Out[453]: 
array([[1, 1],
       [1, 2],
       [1, 3],
       [1, 4]])

Затем вы можете применить уникальный NumPy к каждому столбцу и проверить, содержит ли результат один или несколько элементов.

In [454]: fixidx = np.array([np.unique(x[:, i]).size == 1 for i in range(x.shape[1])])

In [455]: fixidx
Out[455]: array([ True, False])

Наконец, при необходимости вы можете привести fixidx к целому числу:

In [456]: fixidx.astype(int)
Out[456]: array([1, 0])

Кроме того, вы можете получить тот же результат через NumPy's , равный , следующим образом:

fixidx = np.ones(shape=a.shape, dtype=int)
x = [a, b, c, d]
for first, second in zip(x[:-1], x[1:]):
    fixidx *= np.equal(first, second)
0 голосов
/ 31 августа 2018

Код работает отлично, без ошибок. Попробуйте преобразовать логический вывод в целое число:

((a == b) & (b == c) & (c == d)).astype(int)
array([1, 0])
...