パンダ、いくつかのnumpyメソッド、リスト内包法など、これを行うために可能ないくつかのメソッドを比較しました。
まず、ベースラインから始めましょう。
>>> 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
したがって、私たちのベースラインは、カウントが正しい2
必要があり、約をとる必要があるということ50 us
です。
ここで、単純な方法を試します。
>>> 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.
そして、ここでは、間違った答え(NotImplemented != 2
)が返され、時間がかかり、警告がスローされます。
そこで、別の素朴な方法を試してみましょう。
>>> %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 ==
繰り返しますが、間違った答え(0 != 2
)。後続の警告がないため、これはさらに陰湿です(0
と同じように渡すことができます2
)。
それでは、リスト内包表記を試してみましょう。
>>> %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
ここで正しい答えが得られます、そしてそれはかなり速いです!
別の可能性、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 ==
遅いですが正しいです!
そして最後に、私が使用するオプション:numpy
配列を次のobject
タイプにキャストします:
>>> 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
速くて正しい!
thing
(それはnumpyタイプであるかもしれないしそうでないかもしれません;私は知りません)、そして私が見てthing == 'some string'
そして簡単なbool
結果を得たいならば、私は何をすべきですか?np.atleast_1d(thing)[0] == 'some string'
?しかし、これ'some string'
は、配列の最初の要素を配置するジョーカーにとっては堅牢ではありません。thing
最初にタイプをテストしてから==
、それが文字列である(またはnumpyオブジェクトではない)場合にのみテストを実行する必要があると思います。