В Python у меня есть ndarray, y
который печатается какarray([0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1])
Я пытаюсь подсчитать, сколько 0
и сколько 1
s в этом массиве.
Но когда я печатаю y.count(0)
или y.count(1)
, это говорит
numpy.ndarray
объект не имеет атрибутаcount
Что мне делать?
python
numpy
multidimensional-array
count
mflowww
источник
источник
numpy.count_nonzero
.Ответы:
Не бесшумный способ :
Использование
collections.Counter
;источник
dict(zip(*numpy.unique(a, return_counts=True)))
collections.Counter
работал просто отличноКак насчет использования
numpy.count_nonzero
, что-то вродеисточник
numpy.ndarray
как первоначально просили OP.Лично я бы пошел на:
(y == 0).sum()
и(y == 1).sum()
Например
источник
sum( vector==value )
Для вашего случая вы также можете посмотреть в numpy.bincount
источник
Преобразовать ваш массив
y
в список,l
а затем сделатьl.count(1)
иl.count(0)
источник
Если вы знаете, что они справедливы
0
и1
:дает вам количество единиц.
np.sum(1-y)
дает нули.Для небольшой общности, если вы хотите считать,
0
а не ноль (но, возможно, 2 или 3):дает число ненулевое.
Но если вам нужно что-то более сложное, я не думаю, что numpy предоставит хороший
count
вариант. В этом случае перейдите в коллекции:Это ведет себя как диктат
источник
Если вы точно знаете, какой номер вы ищете, вы можете использовать следующее;
возвращает, сколько раз 2 произошло в вашем массиве.
источник
Честно говоря, мне проще всего преобразовать его в серию панд или DataFrame:
Или этот хороший однострочный текст, предложенный Робертом Мюилом:
источник
pd.Series([0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1]).value_counts()
Никто не предложил использовать
numpy.bincount(input, minlength)
сminlength = np.size(input)
, но это, кажется, хорошее решение, и, безусловно, самое быстрое :Это безумное ускорение между
numpy.unique(x, return_counts=True)
иnumpy.bincount(x, minlength=np.max(x))
!источник
np.histogram
не вычисляет то же самое. Нет смысла сравнивать три подхода, которые я предлагаю, сhistogram
функцией, извините.bincount
работает только для целых чисел, поэтому он работает для задачи ОП, но, возможно, не для общей проблемы, описанной в заголовке. Также вы пытались использоватьbincount
с массивами с очень большими целыми числами?bincount
примерно в четыре раза быстрее чемunique
.Что о
len(y[y==0])
иlen(y[y==1])
?источник
y.tolist().count(val)
с val 0 или 1
Поскольку список Python имеет встроенную функцию
count
, преобразование в список перед использованием этой функции является простым решением.источник
Еще одним простым решением может быть использование numpy.count_nonzero () :
Не позволяйте имени вводить вас в заблуждение, если вы используете его с логическим значением, как в примере, это поможет вам.
источник
Для подсчета количества вхождений вы можете использовать
np.unique(array, return_counts=True)
:источник
Я бы использовал np.where:
источник
использовать методы, предлагаемые серией:
источник
Общий и простой ответ:
что привело бы к этому полному коду в качестве примера
Теперь, если MyArray находится в нескольких измерениях, и вы хотите посчитать возникновение распределения значений в строке (= образец в дальнейшем)
источник
Вы можете использовать словарное понимание, чтобы создать аккуратную однострочную строку. Больше о понимании словаря можно найти здесь
Это создаст словарь со значениями в вашем ndarray в качестве ключей и подсчетом значений в качестве значений для ключей соответственно.
Это будет работать всякий раз, когда вы хотите посчитать вхождения значения в массивах этого формата.
источник
Попробуй это:
источник
Это можно легко сделать следующим способом
источник
Поскольку ваш ndarray содержит только 0 и 1, вы можете использовать sum () для получения вхождения 1s и len () - sum () для получения вхождения 0s.
источник
У вас есть специальный массив только с 1 и 0 здесь. Так что хитрость заключается в использовании
который дает вам процент 1 с в вашем массиве. В качестве альтернативы используйте
даст вам абсолютное число 1 и 0 в вашем массиве.
источник
Просто скопировал здесь комментарий Сеппо Энарви, который заслуживает правильного ответа.
источник
Это включает еще один шаг, но более гибкое решение, которое также будет работать для 2d-массивов и более сложных фильтров, состоит в создании логической маски и последующем использовании .sum () для маски.
источник
Если вы не хотите использовать numpy или модуль коллекций, вы можете использовать словарь:
результат:
Конечно, вы также можете использовать оператор if / else. Я думаю, что функция Counter делает почти то же самое, но это более прозрачно.
источник
Для общих записей:
Будет выводить счет:
И показатели:
источник
здесь у меня есть кое-что, благодаря чему вы можете посчитать количество появлений определенного числа: по вашему коду
count_of_zero = лист (у [у == 0]). кол (0)
печать (count_of_zero)
// в соответствии с совпадением будут булевы значения, а в соответствии со значением True будет возвращаться число 0
источник
Если вас интересует самое быстрое выполнение, вы заранее знаете, какое значение (а) нужно искать, и ваш массив является 1D, или вы иным образом интересуетесь результатом для уплощенного массива (в этом случае ввод функции должен будь
np.flatten(arr)
скорее чем простоarr
) тогда Нумба твой другили для очень больших массивов, где распараллеливание может быть полезным:
Сравнительный анализ их
np.count_nonzero()
(который также имеет проблему создания временного массива, которого можно избежать) иnp.unique()
решения на основедля ввода, созданного с помощью:
получены следующие графики (второй ряд графиков - это увеличение при более быстром подходе):
Показано, что решение на основе Numba заметно быстрее, чем аналоги NumPy, и для очень больших входов параллельный подход быстрее, чем наивный.
Полный код доступен здесь .
источник
Если вы имеете дело с очень большими массивами, возможно использование генераторов. Приятно то, что этот подход хорошо работает как для массивов, так и для списков, и вам не нужно никаких дополнительных пакетов. Кроме того, вы не используете столько памяти.
источник
У Numpy есть модуль для этого. Просто небольшой взлом. Поместите ваш входной массив в качестве бинов.
На выходе есть 2 массива. Один с самими значениями, другой с соответствующими частотами.
источник
источник