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