Как проверить, все ли значения массива равны друг другу?

#python #numpy

Вопрос:

Я хочу проверить, есть ли в массиве все одинаковые значения. Примером может быть следующее.

 array1 = np.array([1,1,1,1,1]) would return True
array2 = np.array([1,0,1,0,1]) would return False
 

Я знаю, как проверить, все ли значения в массиве равны определенному значению. Но я хочу проверить, все ли значения в массиве равны друг другу, независимо от того, какое значение. Есть ли способ сделать это с помощью просто Numpy без создания функции?

Комментарии:

1. Если вы знаете, как проверить, являются ли все значения определенным значением, используйте тот же метод, но используйте array[0] его в качестве значения для проверки.

2. Проблема в том, что он возвращает массив True и False. Мне нужно только Истинное или Ложное.

3. Тогда на самом деле это не проверка того, все ли значения равны определенному значению.

Ответ №1:

Вы можете использовать наборы python. Если длина набора равна 1, все значения одинаковы:

 >>> len(set(array1)) == 1
True

>>> len(set(array2)) == 1
False
 

Ответ №2:

Это тоже работает и, кажется, немного быстрее, чем некоторые другие подходы:

 >>> array1 = np.array([1,1,1,1,1])
>>> array2 = np.array([1,0,1,0,1])
>>> (array1 == array1[0]).all()
True
>>> (array2 == array2[0]).all()
False
 

Некоторые очень грубые временные показатели для массива 10k по сравнению с другими решениями:

  • этот подход: 1,07 мсек
  • np.isin() : 1,23 мсек
  • set() : 2,63 мс

Комментарии:

1. Я подтверждаю, что это самый быстрый на момент этого комментария. Мило!

Ответ №3:

Это можно использовать — np.уникальный

 import numpy as np

array1 = np.array([1,1,1,1,1])
#following passes assertion test
assert(len(np.unique(array1, return_counts=True)[0])==1)

#without getting counts of unique values
#assert(len(np.unique(array1))==1)

array2 = np.array([1,0,1,0,1])
#following will throw an assertion error
assert(len(np.unique(array2, return_counts=True)[0])==1)
 

Комментарии:

1. Мне нужно, чтобы он возвращал значение True или False, а не ошибку утверждения.

2. @Conweezy Заменить assert() на print()

Ответ №4:

Моя попытка состояла бы в том, чтобы сравнить все элементы с первым элементом, а затем проверить, содержит ли результат False :

 import numpy as np
array1 = np.array([1,1,1,1,1])
print(not np.isin(False, array1 == array1[0]))
 

На моей машине это происходит быстрее, чем в len(set()) версии с примерно 700 номерами в массиве. На 10000 элементов это быстрее в 5,5 раза, но медленнее, чем np.unique() версия.
Измерено на ядре i7-10750H, 10000 итераций