[英]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=1
給sum
:
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.