Подсчет различных ненулевых значений двух 2D-массивов в Python NumPy - PullRequest
0 голосов
/ 18 октября 2019

Я хотел бы выяснить, сколько значений в двумерном массиве array1 отличаются от значений в array2 в тех же позициях (x, y) и не равны 0 в array2 при использовании Numpy.

array1 = numpy.array([[1, 2], [3, 0]])
array2 = numpy.array([[1, 2], [0, 3]])
print(numpy.count_nonzero(array1 != array2)) # 2

Пример выше печатает 2, потому что 0 и 3 разные. Есть ли способ не считать разницу, если значение в array2 равно 0? Нечто подобное (которое не работает - ValueError: The truth value of an array with more then one element is ambiguous. Use a.any() or a.all()):

print(numpy.count_nonzero(array1 != array2 and array2 != 0)) # Should be 1.

Ответы [ 2 ]

0 голосов
/ 18 октября 2019
a = np.array([[1, 2], [3, 0]])
b = np.array([[1, 2], [0, 3]])

Отфильтровывает нулевые значения b

np.nonzero возвращает индексы, для фильтрации нулевых значений используются многомерные индексные массивы .

In [144]: b.nonzero()
Out[144]: (array([0, 0, 1], dtype=int64), array([0, 1, 1], dtype=int64))

In [145]: a[b.nonzero()]
Out[145]: array([1, 2, 0])

In [146]: b[b.nonzero()]
Out[146]: array([1, 2, 3])

In [147]: c = a[b.nonzero()] != b[b.nonzero()]

In [148]: c.sum()
Out[148]: 1

При этом используется логическое индексирование для фильтрации нулевых значений.

In [149]: b != 0
Out[149]: 
array([[ True,  True],
       [False,  True]], dtype=bool)

In [150]: a[b != 0]
Out[150]: array([1, 2, 0])

In [151]: b[b != 0]
Out[151]: array([1, 2, 3])

In [152]: c = a[b != 0] != b[b != 0]

In [153]: c.sum()
Out[153]: 1
0 голосов
/ 18 октября 2019

Этого можно добиться, заменив and умножением:

print(numpy.count_nonzero((array1 != array2) * (array2 != 0)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...