np.vectorize ではどうですか:
vector_is = np.vectorize(lambda x, y: x is y, otypes=[bool])
次に、あなたは持っています
>>> a = np.array(["abc", "def"], dtype="object")
>>> vector_is(a, "abc")
array([ True, False], dtype=bool)
operator.is_
残念ながら、ここで使用できるかどうかはわかりません。
ValueError: failed to determine the number of arguments for <built-in function is_>
これは、リスト内包表記よりも少し遅いように見えますが (おそらくlambda
呼び出しのため)、受け取る引数に関してもう少し柔軟であるという利点があります。
python -mtimeit -s 'import numpy as np' -s 'import random, string' -s 'a = np.array(["".join(random.choice(string.ascii_lowercase) for x in range(4)) for e in range(100000)])' -s 'vector_is = np.vectorize(lambda x,y: x is y, otypes=[bool])' 'vector_is(a, "abcd")'
10 loops, best of 3: 28.3 msec per loop
python -mtimeit -s 'import numpy as np' -s 'import random, string' -s 'a = np.array(["".join(random.choice(string.ascii_lowercase) for x in range(4)) for e in range(100000)])' -s 'vector_is = np.vectorize(lambda x,y: x is y, otypes=[bool])' '[x is "abcd" for x in a]'
100 loops, best of 3: 20 msec per loop
python -mtimeit -s 'import numpy as np' -s 'import random, string' -s 'a = np.array(["".join(random.choice(string.ascii_lowercase) for x in range(4)) for e in range(100000)])' -s 'vector_is = np.vectorize(lambda x,y: x is y, otypes=[bool])' 'np.fromiter((x is "abcd" for x in a), bool, len(a))'
10 loops, best of 3: 23.8 msec per loop
最後のアプローチnp.fromiter((x is "abcd" for x in a), bool, len(a))
は、リスト内包表記アプローチから numpy 配列を取得する 1 つの方法です。
残念ながら、すべては単に使用するよりもはるかに遅くなります==
:
python -mtimeit -s 'import numpy as np' -s 'import random, string' -s 'a = np.array(["".join(random.choice(string.ascii_lowercase) for x in range(4)) for e in range(100000)])' -s 'vector_is = np.vectorize(lambda x,y: x is y, otypes=[bool])' 'a == "abcd"'
1000 loops, best of 3: 1.42 msec per loop