2016-07-06 12 views
1

2D numpy配列内の特定の値の出現回数を数えるnumpy関数はありますか?例えば。2D配列内のNumpyの出現数を調べる

np.random.random((3,3)) 

array([[ 0.68878371, 0.2511641 , 0.05677177], 
     [ 0.97784099, 0.96051717, 0.83723156], 
     [ 0.49460617, 0.24623311, 0.86396798]]) 

このアレイでは、0.83723156の発生回数を確認するにはどうすればよいですか?

答えて

0

任意の配列で倍x表示されますの数をカウントするには、あなたは、単に結果というboolean型の配列を合計することができます

>>> col = numpy.arange(3) 
>>> cols = numpy.tile(col, 3) 
>>> (cols == 1).sum() 
3 

それは言うまでもないが、私はとにかくそれを言うよ::a == xからあなたがそうのように、範囲を指定しない限り、これは浮動小数点数と非常に便利ではありません。

>>> a = numpy.random.random((3, 3)) 
>>> ((a > 0.5) & (a < 0.75)).sum() 
2 

この一般原則は、あらゆる種類のテストに有効です。たとえば、あなたは一体であり、浮動小数点値の数をカウントしたい場合:

>>> a = numpy.random.random((3, 3)) * 10 
>>> a 
array([[ 7.33955747, 0.89195947, 4.70725211], 
     [ 6.63686955, 5.98693505, 4.47567936], 
     [ 1.36965745, 5.01869306, 5.89245242]]) 
>>> a.astype(int) 
array([[7, 0, 4], 
     [6, 5, 4], 
     [1, 5, 5]]) 
>>> (a == a.astype(int)).sum() 
0 
>>> a[1, 1] = 8 
>>> (a == a.astype(int)).sum() 
1 

Imanol Luengoによって記載されているようにまた、あなたの目標が何であるかに応じて、np.isclose()を使用することができます。しかし、値がの範囲にあるかどうかを知ることは、それらが任意の値に任意に近いかどうかを知るよりもしばしば役に立ちます。

iscloseの問題は、デフォルトの許容値(rtolおよびatol)が任意であり、生成する結果が必ずしも明白でないか、または予測が容易でないことです。複雑な浮動小数点演算を処理するには、浮動小数点演算even moreを実行します。単純な範囲は正確に推論するのがはるかに簡単です。 (これはより一般的な原則の表現である:first, do the simplest thing that could possibly work

なお、iscloseおよびその同類のallcloseがその用途を有する。私は通常、配列全体が別の配列全体と非常に似ているかどうかを確認するためにそれらを使用しますが、これはあなたの質問ではないようです。

+0

感謝@ senderle、-100.0のような浮動小数点数との比較はどうですか?小数点の後の0だけです – user308827

3
arr = np.random.random((3,3)) 
# find the number of elements that get really close to 1.0 
condition = arr == 0.83723156 
# count the elements 
np.count_nonzero(condition) 

conditionの値は、配列の各要素が条件を満足するかどうかを示すブール値のリストです。 np.count_nonzeroは、配列内の非ゼロ要素の数を数えます。ブール値の場合、それはTrue値を持つ要素の数を数えます。

浮動小数点精度に対処できるようにするには、あなたの代わりにこのような何かを行うことができます:

condition = np.fabs(arr - 0.83723156) < 0.001 
1

浮動小数点アレイの場合np.iscloseは、まったく同じ要素との比較やカスタム範囲の定義よりもはるかに優れています。

>>> a = np.array([[ 0.68878371, 0.2511641 , 0.05677177], 
        [ 0.97784099, 0.96051717, 0.83723156], 
        [ 0.49460617, 0.24623311, 0.86396798]]) 

>>> np.isclose(a, 0.83723156).sum() 
1 

==はそうではないnp.iscloseがうまくいく理由は実数が正確コンピュータ内に表現されていないことに注意してくださいが、それは次のようになります。その代わり

>>> (0.1 + 0.2) == 0.3 
False 

>>> np.isclose(0.1 + 0.2, 0.3) 
True 
+0

私はしません範囲を定義するよりもはるかに優れた選択肢です。 'isclose 'によって提供されるデフォルトの許容値(' rtol'と 'atol')は任意であり、生成される結果は必ずしも明白でないか、予測が容易ではありません - 複雑な浮動小数点演算を扱うために、 (https://github.com/numpy/numpy/blob/master/numpy/core/numeric.py#L24540)浮動小数点演算。単純な範囲は正確に推論するのがはるかに簡単です。それでも、私は 'isclose'が時には便利な選択肢であることに同意するので、私は自分の答えにリンクしました。 – senderle

関連する問題