Tôi đã so sánh một số phương pháp có thể để thực hiện việc này, bao gồm pandas, một số phương pháp numpy và phương pháp hiểu danh sách.
Đầu tiên, hãy bắt đầu với đường cơ sở:
>>> import numpy as np
>>> import operator
>>> import pandas as pd
>>> x = [1, 2, 1, 2]
>>> %time count = np.sum(np.equal(1, x))
>>> print("Count {} using numpy equal with ints".format(count))
CPU times: user 52 µs, sys: 0 ns, total: 52 µs
Wall time: 56 µs
Count 2 using numpy equal with ints
Vì vậy, cơ sở của chúng tôi là số lượng phải chính xác 2
và chúng tôi nên thực hiện 50 us
.
Bây giờ, chúng tôi thử phương pháp ngây thơ:
>>> x = ['s', 'b', 's', 'b']
>>> %time count = np.sum(np.equal('s', x))
>>> print("Count {} using numpy equal".format(count))
CPU times: user 145 µs, sys: 24 µs, total: 169 µs
Wall time: 158 µs
Count NotImplemented using numpy equal
/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/ipykernel_launcher.py:1: FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison
"""Entry point for launching an IPython kernel.
Và ở đây, chúng tôi nhận được câu trả lời sai ( NotImplemented != 2
), chúng tôi mất nhiều thời gian và nó đưa ra cảnh báo.
Vì vậy, chúng tôi sẽ thử một phương pháp ngây thơ khác:
>>> %time count = np.sum(x == 's')
>>> print("Count {} using ==".format(count))
CPU times: user 46 µs, sys: 1 µs, total: 47 µs
Wall time: 50.1 µs
Count 0 using ==
Một lần nữa, câu trả lời sai ( 0 != 2
). Điều này thậm chí còn xảo quyệt hơn vì không có cảnh báo tiếp theo ( 0
có thể được thông qua giống như vậy 2
).
Bây giờ, chúng ta hãy thử hiểu danh sách:
>>> %time count = np.sum([operator.eq(_x, 's') for _x in x])
>>> print("Count {} using list comprehension".format(count))
CPU times: user 55 µs, sys: 1 µs, total: 56 µs
Wall time: 60.3 µs
Count 2 using list comprehension
Chúng tôi nhận được câu trả lời đúng ở đây và nó khá nhanh!
Một khả năng khác, pandas
:
>>> y = pd.Series(x)
>>> %time count = np.sum(y == 's')
>>> print("Count {} using pandas ==".format(count))
CPU times: user 453 µs, sys: 31 µs, total: 484 µs
Wall time: 463 µs
Count 2 using pandas ==
Chậm, nhưng chính xác!
Và cuối cùng, tùy chọn tôi sẽ sử dụng: truyền numpy
mảng thành object
kiểu:
>>> x = np.array(['s', 'b', 's', 'b']).astype(object)
>>> %time count = np.sum(np.equal('s', x))
>>> print("Count {} using numpy equal".format(count))
CPU times: user 50 µs, sys: 1 µs, total: 51 µs
Wall time: 55.1 µs
Count 2 using numpy equal
Nhanh chóng và chính xác!
thing
(có thể có hoặc có thể không thuộc loại numpy; tôi không biết) và tôi muốn xem nếuthing == 'some string'
và nhận được mộtbool
kết quả đơn giản , tôi phải làm gì?np.atleast_1d(thing)[0] == 'some string'
? Nhưng điều đó không mạnh mẽ đối với một số joker đưa'some string'
vào phần tử đầu tiên của một mảng. Tôi đoán tôi phải kiểm tra loạithing
đầu tiên và sau đó chỉ thực hiện==
kiểm tra nếu đó là một chuỗi (hoặc không phải là một đối tượng numpy).