#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 итераций