Проверьте равенство нескольких аргументов с помощью Numpy

Я хотел бы проверить равенство нескольких args (т.е. он должен возвращать True если все args равны и False если по крайней мере один аргумент отличается).

Поскольку numpy.equal может обрабатывать только два аргумента, я бы попытался уменьшить, но это, очевидно, не удалось:

 reduce(np.equal, (4, 4, 4)) # return False because... reduce(np.equal, (True, 4)) # ... is False 

Вы можете использовать np.unique чтобы проверить, является ли длина уникальных элементов в вашем массиве np.unique 1:

 np.unique(array).size == 1 

Или np.all() , чтобы проверить, совпадают ли все элементы с одним из ваших элементов (например, первый):

 np.all(array == array[0]) 

Демо-версия:

 >>> a = np.array([1, 1, 1, 1]) >>> b = np.array([1, 1, 1, 2]) >>> np.unique(a).size == 1 True >>> np.unique(b).size == 1 False >>> np.all(a==a[0]) True >>> np.all(b==b[0]) False 

Для этого пакет numpy_indexed имеет встроенную функцию. Обратите внимание, что он также работает с многомерными массивами, т. Е. Вы можете использовать его для проверки, если стек изображений идентичен, например.

 import numpy_indexed as npi npi.all_equal(array) 

Если ваши аргументы являются значениями с плавающей запятой, тест равенства может вызвать странные результаты из-за ошибок округления. В этом случае вы должны использовать более надежный подход, например numpy.allclose :

 In [636]: x = [2./3., .2/.3] In [637]: x Out[637]: [0.6666666666666666, 0.6666666666666667] In [638]: xarr = np.array(x) In [639]: np.unique(xarr).size == 1 Out[639]: False In [640]: np.all(xarr == xarr[0]) Out[640]: False In [641]: reduce(np.allclose, x) Out[641]: True 

Примечание. Пользователи Python 3 должны включить предложение from functools import reduce поскольку reduce больше не является встроенной функцией в Python 3.