В numpy
/ scipy
, есть ли эффективный способ получить счетчики частоты для уникальных значений в массиве?
Что-то в этом роде:
x = array( [1,1,1,2,2,2,5,25,1,1] )
y = freq_count( x )
print y
>> [[1, 5], [2,3], [5,1], [25,1]]
(Для вас, пользователей R, я в основном ищу table()
функцию)
collections.Counter(x)
Достаточно ли ?Ответы:
Посмотрите на
np.bincount
:http://docs.scipy.org/doc/numpy/reference/generated/numpy.bincount.html
А потом:
или:
или, однако, вы хотите объединить количество и уникальные значения.
источник
Начиная с Numpy 1.9, самый простой и быстрый способ - просто использовать
numpy.unique
, который теперь имеетreturn_counts
ключевое слово аргумент:Который дает:
Быстрое сравнение с
scipy.stats.itemfreq
:источник
return_counts
аргумент не существовал, что могло бы объяснить исключение. В этом случае документы предполагают, чтоnp.unique(x, True)
это эквивалентно томуnp.unique(x, return_index=True)
, что не возвращает счет.unique, idx = np.unique(x, return_inverse=True); counts = np.bincount(idx)
. Когда эта функция была добавлена (см. Здесь ), некоторые неформальные тесты использовалиreturn_counts
тактирование в 5 раз быстрее.Обновление: метод, упомянутый в исходном ответе, устарел, вместо него следует использовать новый:
Оригинальный ответ:
Вы можете использовать scipy.stats.itemfreq
источник
Меня это тоже заинтересовало, поэтому я провел небольшое сравнение производительности (используя perfplot , мой любимый проект). Результат:
безусловно самый быстрый. (Обратите внимание на масштабирование журнала.)
Код для генерации сюжета:
источник
equality_check=array_sorteq
вperfplot.show()
. Причиной ошибки (в Python 2) былоpd.value_counts
(даже с sort = False).Используя модуль pandas:
источник
Это, безусловно, наиболее общее и эффективное решение; удивило, что это еще не было отправлено.
В отличие от принятого в настоящее время ответа, он работает с любым типом данных, который можно сортировать (не только с положительными целевыми значениями), и имеет оптимальную производительность; единственные значительные затраты заключаются в сортировке, выполняемой np.unique.
источник
AttributeError: 'numpy.ufunc' object has no attribute 'at'
np.bincount(inverse)
numpy.bincount
это, наверное, лучший выбор. Если ваш массив содержит что-то кроме маленьких плотных целых чисел, может быть полезно обернуть его примерно так:Например:
источник
Несмотря на то, что на него уже ответили, я предлагаю другой подход, который использует
numpy.histogram
. Такая функция, учитывая последовательность, она возвращает частоту своих элементов, сгруппированных в ячейки .Осторожно, хотя : в этом примере это работает, потому что числа являются целыми числами. Если бы они, где реальные цифры, то это решение не будет применяться так же хорошо.
источник
Это дает вам: {1: 5, 2: 3, 5: 1, 25: 1}
источник
collections.Counter(x)
также дают тот же результат. Я считаю, что OP хочет вывод, который напоминаетtable
функцию R. ХранениеSeries
может быть более полезным.pd.Series(x).reshape(-1)
если это многомерный массив.Чтобы подсчитать уникальные нецелые числа - аналогично ответу Eelco Hoogendoorn, но значительно быстрее (коэффициент 5 на моей машине), я привык
weave.inline
сочетатьnumpy.unique
с небольшим количеством c-кода;Информация о профиле
Чистая
numpy
версия Eelco :Заметка
Здесь есть избыточность (также
unique
выполняет сортировку), что означает, что код, возможно, можно было бы дополнительно оптимизировать, поместивunique
функциональность в цикл c-code.источник
Старый вопрос, но я хотел бы, чтобы обеспечить свое собственное решение , которое оказаться самым быстрым, использовать нормальные
list
вместо вnp.array
качестве входных данных (или передачи список во - первых), на основании моих стендовых испытаний.Проверьте это, если вы сталкиваетесь с этим также.
Например,
100000 циклов, лучшее из 3: 2,26 мкс на цикл
100000 циклов, лучшее из 3: 8,8 мкс на цикл
100000 циклов, лучшее из 3: 5,85 мкс на цикл
Пока принятый ответ будет медленнее, а
scipy.stats.itemfreq
решение еще хуже.Более глубокое тестирование не подтвердило сформулированное ожидание.
Ссылка ниже приводятся комментарии к кешу и другим побочным эффектам в оперативной памяти, которые влияют на небольшой набор данных с повторяющимися результатами тестирования.
источник
numpy
это не обязательно путь.что-то подобное должно сделать это:
Кроме того, этот предыдущий пост об эффективном подсчете уникальных элементов кажется очень похожим на ваш вопрос, если только я что-то не упустил.
источник
многомерный подсчет частоты, то есть подсчет массивов.
источник
источник
источник