しきい値の配列が与えられたnumpy
場合、これらの値を満たす別の配列のカウントの配列を生成する最も効率的な方法は何ですか?
しきい値の配列は小さく、並べ替えられており、カウントされる値の配列は大きく、並べ替えられていないとします。
例:の各要素について、それ以上valueLevels
の要素を数えます。values
import numpy as np
n = int(1e5) # size of example
# example levels: the sequence 0, 1., 2.5, 5., 7.5, 10, 5, ... 50000, 75000
valueLevels = np.concatenate(
[np.array([0.]),
np.concatenate([ [ x*10**y for x in [1., 2.5, 5., 7.5] ]
for y in range(5) ] )
]
)
np.random.seed(123)
values = np.random.uniform(low=0, high=1e5, size=n)
これまでのところ、リスト内包表記のアプローチを試してきました。
np.array([sum(values>=x) for x in valueLevels])
容認できないほど遅かったnp.array([len(values[values>=x]) for x in valueLevels])
改善でした- 並べ替え
values
は理解を高速化しましたが (例では、約 7 ミリ秒から 0.5 ミリ秒)、並べ替えのコスト (約 8 ミリ秒) は 1 回の使用での節約を上回りました。
私が今持っている最高のものは、このアプローチの理解です:
%%timeit
np.array([np.count_nonzero(values>=x) for x in valueLevels])
# 1000 loops, best of 3: 1.26 ms per loop
これは私の目的には受け入れられますが、好奇心から、
私が知りたいのは
- リストの理解が進むべき道である場合、それをスピードアップできますか? または、
- 他のアプローチはより高速ですか?(値の配列をしきい値の配列にブロードキャストすることでこれを行うことができるという漠然とした感覚がありますが、の次元を正しく取得する方法がわかりません
np.broadcast_arrays()
。