Tôi có một mảng NumPy 'boolarr' thuộc loại boolean. Tôi muốn đếm số phần tử có giá trị là True
. Có một thói quen NumPy hoặc Python dành riêng cho nhiệm vụ này không? Hoặc, tôi có cần lặp lại các yếu tố trong kịch bản của mình không?
Tôi có một mảng NumPy 'boolarr' thuộc loại boolean. Tôi muốn đếm số phần tử có giá trị là True
. Có một thói quen NumPy hoặc Python dành riêng cho nhiệm vụ này không? Hoặc, tôi có cần lặp lại các yếu tố trong kịch bản của mình không?
Câu trả lời:
Bạn có nhiều lựa chọn. Hai lựa chọn như sau.
numpy.sum(boolarr)
numpy.count_nonzero(boolarr)
Đây là một ví dụ:
>>> 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
Tất nhiên, đó là một bool
câu trả lời cụ thể. Tổng quát hơn, bạn có thể sử dụng numpy.count_nonzero
.
>>> np.count_nonzero(boolarr)
5
bool
: các giá trị boolean được coi là 1 và 0 trong các phép toán số học. Xem " Giá trị Boolean " trong tài liệu Thư viện chuẩn Python. Lưu ý rằng NumPy bool
và Python bool
không giống nhau, nhưng chúng tương thích (xem tại đây để biết thêm thông tin).
numpy.count_nonzero
không tham gia NumPy v1.5.1: bạn đã đúng. Theo thông báo phát hành này , nó đã được thêm vào NumPy v1.6.0.
numpy.count_nonzero
nhanh hơn khoảng một nghìn lần, trong trình thông dịch Python của tôi, ít nhất. python -m timeit -s "import numpy as np; bools = np.random.uniform(size=1000) >= 0.5" "np.count_nonzero(bools)"
so vớipython -m timeit -s "import numpy as np; bools = np.random.uniform(size=1000) >= 0.5" "sum(bools)"
np.sum(bools)
thay thế! Tuy nhiên, np.count_nonzero(bools)
vẫn nhanh hơn ~ 12 lần.
Câu hỏi đó đã giải quyết một câu hỏi khá giống tôi và tôi nghĩ mình nên chia sẻ:
Trong python thô, bạn có thể sử dụng sum()
để đếm True
các giá trị trong list
:
>>> sum([True,True,True,False,False])
3
Nhưng điều này sẽ không hoạt động:
>>> sum([[False, False, True], [True, False, True]])
TypeError...
Về mặt so sánh hai mảng numpy và đếm số lượng trận đấu (ví dụ: dự đoán lớp chính xác trong học máy), tôi thấy ví dụ dưới đây cho hai chiều hữu ích:
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])
có thể được mở rộng đến kích thước D.
Kết quả là:
Sự dự đoán:
[[1 2]
[2 0]
[2 0]
[1 2]
[1 2]]
Mục tiêu:
[[0 1]
[1 0]
[2 0]
[0 0]
[2 1]]
Đếm dự đoán đúng cho D = 1: 1
Đếm dự đoán đúng cho D = 2: 2