web-dev-qa-db-ja.com

Pythonのndarray内の特定のアイテムの出現回数を数える方法は?

Pythonでは、array([0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1])として出力されるndarray yがあります。

この配列に何個の0と何個の1があるかを数えようとしています。

しかし、私がy.count(0)またはy.count(1)とタイプするとき、それは言います

numpy.ndarrayオブジェクトには属性がありませんcount

私は何をすべきか?

243
mflowww
>>> a = numpy.array([0, 3, 0, 1, 0, 1, 2, 1, 0, 0, 0, 0, 1, 3, 4])
>>> unique, counts = numpy.unique(a, return_counts=True)
>>> dict(Zip(unique, counts))
{0: 7, 1: 4, 2: 1, 3: 2, 4: 1}

でこぼこではない方法

collections.Counter ;を使用してください。

>> import collections, numpy

>>> a = numpy.array([0, 3, 0, 1, 0, 1, 2, 1, 0, 0, 0, 0, 1, 3, 4])
>>> collections.Counter(a)
Counter({0: 7, 1: 4, 3: 2, 2: 1, 4: 1})
407
ozgur

numpy.count_nonzero を使うことについてはどうでしょうか。

>>> import numpy as np
>>> y = np.array([1, 2, 2, 2, 2, 0, 2, 3, 3, 3, 0, 0, 2, 2, 0])

>>> np.count_nonzero(y == 1)
1
>>> np.count_nonzero(y == 2)
7
>>> np.count_nonzero(y == 3)
3
176
Aziz Alto

個人的には、(y == 0).sum()(y == 1).sum()に行きます。

例えば。

import numpy as np
y = np.array([0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1])
num_zeros = (y == 0).sum()
num_ones = (y == 1).sum()
100
Gus Hecht

あなたの場合は、 numpy.bincount を調べることもできます。

In [56]: a = np.array([0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1])

In [57]: np.bincount(a)
Out[57]: array([8, 4])  #count of zeros is at index 0 : 8
                        #count of ones is at index 1 : 4
30
Akavall

配列yをリ​​ストlに変換してからl.count(1)l.count(0)を実行します。

>>> y = numpy.array([0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1])
>>> l = list(y)
>>> l.count(1)
4
>>> l.count(0)
8 
17
Milind Dumbare
y = np.array([0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1])

あなたがそれらが単なる01であることを知っているならば:

np.sum(y)

あなたに1の数を与えます。 np.sum(1-y)はゼロを与えます。

一般的なことですが、ゼロではなく0を数えたい場合(ただし2または3)

np.count_nonzero(y)

ゼロ以外の数を与えます。

しかし、もっと複雑なものが必要な場合は、numpyがNice countオプションを提供するとは思わない。その場合は、コレクションにアクセスしてください。

import collections
collections.Counter(y)
> Counter({0: 8, 1: 4})

これは口述のように振る舞います

collections.Counter(y)[0]
> 8
14
Joel

探している番号が正確にわかっている場合は、次のものを使用できます。

lst = np.array([1,1,2,3,3,6,6,6,3,2,1])
(lst == 2).sum()

配列内に2が出現した回数を返します。

12
CanCeylan

len(y[y==0])len(y[y==1])はどうですか?

6
Anas

出現回数を数えるには、 np.unique(array, return_counts=True) を使用します。

In [75]: boo = np.array([0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1])

# use bool value `True` or equivalently `1`
In [77]: uniq, cnts = np.unique(boo, return_counts=1)
In [81]: uniq
Out[81]: array([0, 1])   #unique elements in input array are: 0, 1

In [82]: cnts
Out[82]: array([8, 4])   # 0 occurs 8 times, 1 occurs 4 times
5
kmario23

さらにもう1つの簡単な解決策は、 numpy.count_nonzero() を使用することです。

import numpy as np
y = np.array([0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1])
y_nonzero_num = np.count_nonzero(y==1)
y_zero_num = np.count_nonzero(y==0)
y_nonzero_num
4
y_zero_num
8

例のように名前をブール値と一緒に使用した場合、名前に誤解を招かせないでください。

5
NaZo

正直なところ、私はそれがパンダシリーズまたはデータフレームに変換するのが最も簡単であると思います:

import pandas as pd
import numpy as np

df = pd.DataFrame({'data':np.array([0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1])})
print df['data'].value_counts()

あるいはRobert Muilが提案したこの素敵なワンライナー:

pd.Series([0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1]).value_counts()
5
wordsforthewise

y.tolist().count(val)

val 0または1

Pythonリストはネイティブ関数countを持っているので、その関数を使う前にlistに変換することは簡単な解決策です。

5
michael

私はnp.whereを使用します。

how_many_0 = len(np.where(a==0.)[0])
how_many_1 = len(np.where(a==1.)[0])
4
MaxG

numpy.bincount(input, minlength)minlength = np.size(input)と一緒に使用することを推奨する人はいませんが、これは良い解決策であると思われます。間違いなく最速

In [1]: choices = np.random.randint(0, 100, 10000)

In [2]: %timeit [ np.sum(choices == k) for k in range(min(choices), max(choices)+1) ]
100 loops, best of 3: 2.67 ms per loop

In [3]: %timeit np.unique(choices, return_counts=True)
1000 loops, best of 3: 388 µs per loop

In [4]: %timeit np.bincount(choices, minlength=np.size(choices))
100000 loops, best of 3: 16.3 µs per loop

それはnumpy.unique(x, return_counts=True)numpy.bincount(x, minlength=np.max(x))の間のおかしいスピードアップです!

3
Næreen

あなたはきちんとしたワンライナーを作成するために辞書理解を使うことができます。辞書の理解についての詳細 はここにあります

>>>counts = {int(value): list(y).count(value) for value in set(y)}
>>>print(counts)
{0: 8, 1: 4}

これにより、ndarray内の値をキーとして、値のカウントをキーの値として持つ辞書が作成されます。

このフォーマットの配列で値の出現回数を数えたいときはいつでもこれは機能します。

2
CB Madsen

シリーズが提供する方法を活用します。

>>> import pandas as pd
>>> y = np.array([0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1])
>>> pd.Series(y).value_counts()
0    8
1    4
dtype: int64

Ndarrayには0と1しか含まれていないので、sum()を使用して1の出現を取得し、len() - sum()を使用して0の出現を取得できます。

num_of_ones = sum(array)
num_of_zeros = len(array)-sum(array)
1
Sabeer Ebrahim

これは以下の方法で簡単に行えます。

y = np.array([0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1])
y.tolist().count(1)
1
user7055304

一般的で簡単な答えは、

numpy.sum(MyArray==x)   # sum of a binary list of the occurence of x (=0 or 1) in MyArray

例としてこの完全なコードになるでしょう

import numpy
MyArray=numpy.array([0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1])  # array we want to search in
x=0   # the value I want to count (can be iterator, in a list, etc.)
numpy.sum(MyArray==0)   # sum of a binary list of the occurence of x in MyArray

MyArrayが 多次元 にあり、値の分布が発生していることを列に数えたい場合(= pattern以降)

MyArray=numpy.array([[6, 1],[4, 5],[0, 7],[5, 1],[2, 5],[1, 2],[3, 2],[0, 2],[2, 5],[5, 1],[3, 0]])
x=numpy.array([5,1])   # the value I want to count (can be iterator, in a list, etc.)
temp = numpy.ascontiguousarray(MyArray).view(numpy.dtype((numpy.void, MyArray.dtype.itemsize * MyArray.shape[1])))  # convert the 2d-array into an array of analyzable patterns
xt=numpy.ascontiguousarray(x).view(numpy.dtype((numpy.void, x.dtype.itemsize * x.shape[0])))  # convert what you search into one analyzable pattern
numpy.sum(temp==xt)  # count of the searched pattern in the list of patterns
1
sol

総称入力の場合

x = np.array([11, 2, 3, 5, 3, 2, 16, 10, 10, 3, 11, 4, 5, 16, 3, 11, 4])
n = {i:len([j for j in np.where(x==i)[0]]) for i in set(x)}
ix = {i:[j for j in np.where(x==i)[0]] for i in set(x)}

カウントを出力します。

{2: 2, 3: 4, 4: 2, 5: 2, 10: 2, 11: 3, 16: 2}

そしてインデックス:

{2: [1, 5],
3: [2, 4, 9, 14],
4: [11, 16],
5: [3, 12],
10: [7, 8],
11: [0, 10, 15],
16: [6, 13]}
0
deckard

もう1つのステップがありますが、2次元配列やより複雑なフィルタに対しても有効な、より柔軟な解決策は、ブール値のマスクを作成してからそのマスクに.sum()を使用することです。

>>>>y = np.array([0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1])
>>>>mask = y == 0
>>>>mask.sum()
8
0
Thomas

ここには1と0だけの特別な配列があります。だからトリックは使用することです

np.mean(x)

これはあなたの配列の中の1のパーセンテージを与えます。あるいは、

np.sum(x)
np.sum(1-x)

あなたの配列の1と0の絶対数をあなたに与えるでしょう。

0
CathyQian

Numpyはこれのためのモジュールを持っています。ちょっとしたハック。入力配列をビンとして入れます。

numpy.histogram(y, bins=y)

出力は2つの配列です。 1つは値自体を持ち、もう1つは対応する周波数を持つ.

0
Ishan Tomar

Numpyやcollectionsモジュールを使いたくないのなら、辞書を使うことができます。

d = dict()
a = [0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1]
for item in a:
    try:
        d[item]+=1
    except KeyError:
        d[item]=1

結果:

>>>d
{0: 8, 1: 4}

もちろん、if/else文を使うこともできます。 Counter関数はほとんど同じことをすると思いますが、これはより透明です。

0
JLT