Câu hỏi cũ, nhưng tôi muốn cung cấp giải pháp của riêng mình, hóa ra là nhanh nhất, sử dụng bình thường list
thay vì np.array
làm đầu vào (hoặc chuyển sang danh sách trước tiên), dựa trên bài kiểm tra của tôi.
Kiểm tra xem nếu bạn gặp nó là tốt.
def count(a):
results = {}
for x in a:
if x not in results:
results[x] = 1
else:
results[x] += 1
return results
Ví dụ,
>>>timeit count([1,1,1,2,2,2,5,25,1,1]) would return:
100000 vòng, tốt nhất là 3: 2,26 lượt mỗi vòng
>>>timeit count(np.array([1,1,1,2,2,2,5,25,1,1]))
100000 vòng lặp, tốt nhất là 3: 8,8.
>>>timeit count(np.array([1,1,1,2,2,2,5,25,1,1]).tolist())
100000 vòng, tốt nhất là 3: 5,85 lượt mỗi vòng
Trong khi câu trả lời được chấp nhận sẽ chậm hơn, và scipy.stats.itemfreq
giải pháp thậm chí còn tồi tệ hơn.
Một thử nghiệm sâu sắc hơn đã không xác nhận kỳ vọng được xây dựng.
from zmq import Stopwatch
aZmqSTOPWATCH = Stopwatch()
aDataSETasARRAY = ( 100 * abs( np.random.randn( 150000 ) ) ).astype( np.int )
aDataSETasLIST = aDataSETasARRAY.tolist()
import numba
@numba.jit
def numba_bincount( anObject ):
np.bincount( anObject )
return
aZmqSTOPWATCH.start();np.bincount( aDataSETasARRAY );aZmqSTOPWATCH.stop()
14328L
aZmqSTOPWATCH.start();numba_bincount( aDataSETasARRAY );aZmqSTOPWATCH.stop()
592L
aZmqSTOPWATCH.start();count( aDataSETasLIST );aZmqSTOPWATCH.stop()
148609L
Tham chiếu nhận xét bên dưới về bộ đệm và các tác dụng phụ trong RAM khác ảnh hưởng đến một tập dữ liệu nhỏ ồ ạt kết quả kiểm tra lặp đi lặp lại.
collections.Counter(x)
đủ không?