簡體   English   中英

如何統計NumPy bool數組中真正元素的個數

[英]How to count the number of true elements in a NumPy bool array

我有一個 NumPy 類型為 boolean 的數組“boolarr”。 我想計算值為True的元素的數量。 是否有專用於此任務的 NumPy 或 Python 例程? 或者,我是否需要遍歷腳本中的元素?

您有多種選擇。 以下是兩個選項。

boolarr.sum()
numpy.count_nonzero(boolarr)

下面是一個例子:

>>> import numpy as np
>>> boolarr = np.array([[0, 0, 1], [1, 0, 1], [1, 0, 1]], dtype=np.bool)
>>> boolarr
array([[False, False,  True],
       [ True, False,  True],
       [ True, False,  True]], dtype=bool)

>>> boolarr.sum()
5

當然,這是一個bool特定的答案。 更一般地,您可以使用numpy.count_nonzero

>>> np.count_nonzero(boolarr)
5

這個問題為我解決了一個非常相似的問題,我想我應該分享:

在原始 python 中,您可以使用sum()來計算list True值:

>>> sum([True,True,True,False,False])
3

但這行不通:

>>> sum([[False, False, True], [True, False, True]])
TypeError...

在比較兩個 numpy 數組和計算匹配數(例如機器學習中的正確類預測)方面,我發現以下二維示例很有用:

import numpy as np
result = np.random.randint(3,size=(5,2)) # 5x2 random integer array
target = np.random.randint(3,size=(5,2)) # 5x2 random integer array

res = np.equal(result,target)
print result
print target
print np.sum(res[:,0])
print np.sum(res[:,1])

可以擴展到 D 維。

結果是:

預言:

[[1 2]
 [2 0]
 [2 0]
 [1 2]
 [1 2]]

目標:

[[0 1]
 [1 0]
 [2 0]
 [0 0]
 [2 1]]

D=1 的正確預測數: 1

D=2 的正確預測數: 2

如果您希望進行每行計數,請將axis=1sum

boolarr
# array([[False, False,  True],
#        [ True, False,  True],
#        [ True, False,  True]], dtype=bool)

boolarr.sum(axis=1)
# array([1, 2, 2])

同樣,使用np.count_nonzero

np.count_nonzero(boolarr, axis=1)
# array([1, 2, 2])
boolarr.sum(axis=1 or axis=0)

axis = 1 將輸出一行中的 true 數,axis = 0 將計算列中的 true 數,因此

boolarr[[true,true,true],[false,false,true]]
print(boolarr.sum(axis=1))

將是 (3,1)

b[b].size

其中b是有問題的布爾 ndarray。 它將b過濾為True ,然后計算過濾后數組的長度。

這可能不像前面提到的np.count_nonzero()那樣有效,但是如果您忘記了其他語法,則很有用。 此外,這種更短的語法可以節省程序員的時間。

演示:

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

In [2]: a
Out[2]: array([0, 1, 3])

In [3]: a[a>=1].size
Out[3]: 2

In [5]: b=a>=1

In [6]: b
Out[6]: array([False,  True,  True])

In [7]: b[b].size
Out[7]: 2

對於一維數組,這對我有用:

import numpy as np
numbers= np.array([3, 1, 5, 2, 5, 1, 1, 5, 1, 4, 2, 1, 4, 5, 3, 4, 
                  5, 2, 4, 2, 6, 6, 3, 6, 2, 3, 5, 6, 5])

numbersGreaterThan2= np.count_nonzero(numbers> 2)

暫無
暫無

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

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