Сравнение двух массивов numpy для равенства, по элементам

Каков самый простой способ сравнить два массива numpy для равенства (где равенство определено как: A = B iff для всех индексов i: A[i] == B[i] )?

Просто использование == дает мне логический массив:

  >>> numpy.array([1,1,1]) == numpy.array([1,1,1]) array([ True, True, True], dtype=bool) 

Нужно ли мне and элементам этого массива определить, равны ли массивы, или есть более простой способ сравнения?

3 Solutions collect form web for “Сравнение двух массивов numpy для равенства, по элементам”

 (A==B).all() 

если все значения массива (A == B) равны True.

Изменить (из ответа dbaupp и комментария yoavram)

Необходимо отметить, что:

  • это решение может иметь странное поведение в конкретном случае: если A или B пуст, а другой содержит один элемент, то он возвращает True . По какой-то причине сравнение A==B возвращает пустой массив, для которого оператор all возвращает True .
  • Другой риск заключается в том, что если A и B не имеют одинаковой формы и не транслируются, тогда этот подход вызовет ошибку.

В заключение, решение, которое я предложил, является стандартным, я думаю, но если у вас есть сомнения относительно формы A и B или вы просто хотите быть в безопасности: используйте одну из специализированных функций:

 np.array_equal(A,B) # test if same shape, same elements values np.array_equiv(A,B) # test if broadcastable shape, same elements values np.allclose(A,B,...) # test if same shape, elements have close enough values 

Решение (A==B).all() очень аккуратно, но для этой задачи есть встроенные функции. А именно array_equal , allclose и array_equiv .

(Хотя некоторые быстрые тесты с использованием timeit похоже, указывают на то, что метод (A==B).all() является самым быстрым, что немного странно, поскольку ему нужно выделить целый новый массив.)

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

 import numpy as np import time exec_time0 = [] exec_time1 = [] exec_time2 = [] sizeOfArray = 5000 numOfIterations = 200 for i in xrange(numOfIterations): A = np.random.randint(0,255,(sizeOfArray,sizeOfArray)) B = np.random.randint(0,255,(sizeOfArray,sizeOfArray)) a = time.clock() res = (A==B).all() b = time.clock() exec_time0.append( b - a ) a = time.clock() res = np.array_equal(A,B) b = time.clock() exec_time1.append( b - a ) a = time.clock() res = np.array_equiv(A,B) b = time.clock() exec_time2.append( b - a ) print 'Method: (A==B).all(), ', np.mean(exec_time0) print 'Method: np.array_equal(A,B),', np.mean(exec_time1) print 'Method: np.array_equiv(A,B),', np.mean(exec_time2) 

Вывод

 Method: (A==B).all(), 0.03031857 Method: np.array_equal(A,B), 0.030025185 Method: np.array_equiv(A,B), 0.030141515 

Согласно вышеизложенным результатам, методы numpy кажутся быстрее, чем комбинация оператора == и метода all (), и, сравнивая методы numpy, самым быстрым из них является метод numpy.array_equal .

  • Workpool совместим с python3.4 на окнах?
  • Идиоматический способ изменения аргументов по умолчанию
  • Какую библиотеку python 3 я должен использовать для MySQL?
  • Асинхронная обработка исключений в Python
  • __getattr__ на модуле
  • python: два модуля и классы с одинаковым именем в разных пакетах
  • Нужен графический интерфейс Python / tkinter для динамического обновления самого себя (для многоязычного графического интерфейса)
  • Как написать список в файл с символами новой строки в Python3
  •  
    Interesting Posts for Van-Lav
    Python - лучший язык программирования в мире.