[python] 既存の値よりも大きい値のナンシー最初の発生



Answers

配列のソートされたコンテンツがある場合、さらに高速なメソッドがsearchsortedます。

import time
N = 10000
aa = np.arange(-N,N)
%timeit np.searchsorted(aa, N/2)+1
%timeit np.argmax(aa>N/2)
%timeit np.where(aa>N/2)[0][0]
%timeit np.nonzero(aa>N/2)[0][0]

# Output
100000 loops, best of 3: 5.97 µs per loop
10000 loops, best of 3: 46.3 µs per loop
10000 loops, best of 3: 154 µs per loop
10000 loops, best of 3: 154 µs per loop
Question

私はnumpyで1D配列を持っていて、値がnumpy配列の値を超えるインデックスの位置を探したい。

例えば

aa = range(-10,10)

aa位置は、値5が超過する場所を検索します。




私もこれに興味を持ち、提案されたすべての回答をperfplotと比較しperfplot 。 (免責事項:私はperfplotの著者です。)

探している配列が既にソートされていることがわかっている場合は、

numpy.searchsorted(a, alpha)

あなたのためです。 これは一定時間の動作です。つまり、速度は配列のサイズに依存しませ 。 あなたはそれよりも速くなることはできません。

あなたの配列について何も知らなければ、あなたは間違っていません

numpy.argmax(a > alpha)

既にソート済み:

ソートされていない:

プロットを再現するコード:

import numpy
import perfplot


alpha = 0.5

def argmax(data):
    return numpy.argmax(data > alpha)

def where(data):
    return numpy.where(data > alpha)[0][0]

def nonzero(data):
    return numpy.nonzero(data > alpha)[0][0]

def searchsorted(data):
    return numpy.searchsorted(data, alpha)

out = perfplot.show(
    # setup=numpy.random.rand,
    setup=lambda n: numpy.sort(numpy.random.rand(n)),
    kernels=[
        argmax, where,
        nonzero,
        searchsorted
        ],
    n_range=[2**k for k in range(2, 20)],
    logx=True,
    logy=True,
    xlabel='len(array)'
    )



私は一緒に行くだろう

i = np.min(np.where(V >= x))

Vはベクトル(1次元配列)、 xは値、 iは結果のインデックスです。




Related



Tags

python python   numpy