簡體   English   中英

Numpy 查找二維數組中出現的次數

[英]Numpy find number of occurrences in a 2D array

有沒有一個numpy function來統計二維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在此數組中出現的次數?

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

對於浮點數組, 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

要計算x在任何數組中出現的次數,您可以簡單地將由a == x得到的布爾數組求和:

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

它應該不言而喻,但無論如何我會說:除非你指定一個范圍,否則這對浮點數不是很有用,如下所示:

>>> 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的問題在於其默認容差值( rtolatol )是任意的,並且它生成的結果並不總是顯而易見或易於預測。 為了處理復雜的浮點運算,它做了更多的浮點運算! 簡單的范圍更容易推理。 (這是一個更一般的原則的表達: 首先,做最簡單的事情,可能有效 。)

仍然, isclose及其堂兄allclose有其用途。 我通常使用它們來查看整個數組是否與另一個整個數組非常相似,這似乎不是你的問題。

如果它可能對任何人都有用:對於非常大的 2D arrays,如果你想計算所有元素在整個數組中出現的次數,可以將數組展平成一個列表,然后計算每個元素出現的次數:

from itertools import chain
import collections
from collections import Counter

#large array is called arr
flatten_arr = list(chain.from_iterable(arr))
dico_nodeid_appearence = Counter(flatten_arr)
#how may times x appeared in the arr
dico_nodeid_appearence[x]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM