6

しきい値の配列が与えられた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()
4

2 に答える 2