ฉันมี 'boolarr' ประเภทบูลีน NumPy True
ฉันต้องการที่จะนับจำนวนขององค์ประกอบที่มีค่าเป็น มีชุดคำสั่ง NumPy หรือ Python สำหรับงานนี้หรือไม่? หรือฉันต้องย้ำองค์ประกอบในสคริปต์ของฉันหรือไม่
ฉันมี 'boolarr' ประเภทบูลีน NumPy True
ฉันต้องการที่จะนับจำนวนขององค์ประกอบที่มีค่าเป็น มีชุดคำสั่ง NumPy หรือ Python สำหรับงานนี้หรือไม่? หรือฉันต้องย้ำองค์ประกอบในสคริปต์ของฉันหรือไม่
คำตอบ:
คุณมีหลายทางเลือก สองตัวเลือกมีดังต่อไปนี้
numpy.sum(boolarr)
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)
>>> np.sum(boolarr)
5
แน่นอนว่าเป็นbool
คำตอบเฉพาะ numpy.count_nonzero
โดยทั่วไปคุณสามารถใช้
>>> np.count_nonzero(boolarr)
5
bool
: ค่าบูลีนจะถือว่าเป็น 1 และ 0 ในการดำเนินการทางคณิตศาสตร์ ดู " ค่าบูลีน " ในเอกสาร Python Standard Library โปรดทราบว่า NumPy bool
และ Python bool
ไม่เหมือนกัน แต่เข้ากันได้ (ดูข้อมูลเพิ่มเติมได้ที่นี่ )
numpy.count_nonzero
ไม่ได้อยู่ใน NumPy v1.5.1: คุณพูดถูก ตามประกาศของรุ่นนี้มันถูกเพิ่มเข้ามาใน NumPy v1.6.0
numpy.count_nonzero
เร็วกว่าพันเท่าในล่ามภาษาไพ ธ อนอย่างน้อย python -m timeit -s "import numpy as np; bools = np.random.uniform(size=1000) >= 0.5" "np.count_nonzero(bools)"
และpython -m timeit -s "import numpy as np; bools = np.random.uniform(size=1000) >= 0.5" "sum(bools)"
np.sum(bools)
แทน! อย่างไรก็ตามnp.count_nonzero(bools)
ยังคงเร็วกว่า ~ 12x
คำถามนั้นแก้ไขคำถามที่คล้ายกันสำหรับฉันและฉันคิดว่าฉันควรแบ่งปัน:
ในงูหลามดิบคุณสามารถใช้sum()
เพื่อนับTrue
ค่าในlist
:
>>> sum([True,True,True,False,False])
3
แต่สิ่งนี้จะไม่ทำงาน:
>>> sum([[False, False, True], [True, False, True]])
TypeError...
ในแง่ของการเปรียบเทียบอาร์เรย์สองอันและการนับจำนวนการแข่งขัน (เช่นการทำนายคลาสที่ถูกต้องในการเรียนรู้ของเครื่อง) ฉันพบตัวอย่างด้านล่างสำหรับสองมิติที่มีประโยชน์:
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])
ซึ่งสามารถขยายเป็นมิติข้อมูลได้
ผลลัพธ์ที่ได้คือ:
คาดการณ์:
[[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