0

ちょっと厄介な問題に遭遇しました。私の問題はこれです:

0 から 1 までの一連の数値があります: [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9]

そして 2 つの境界、たとえば 0.25 と 0.75 です。

この場合 (2, 6) の境界内にあるシリーズの最初の数字と最後の数字のインデックスをすばやくきれいに見つける方法が必要です。

これまでのところ、for ループと break コマンドを使用する不器用な方法しか思いつきませんでした。

助けてくれてありがとう!

4

2 に答える 2

3

一連の数値が常にソートされている場合はbisectモジュールを使用してエンドポイントのバイナリ検索を実行できます。

>>> a = [.1, .2, .3, .4, .5, .6, .7, .8, .9]
>>> import bisect
>>> bisect.bisect_left(a, 0.25)
2
>>> bisect.bisect_right(a, 0.75) - 1
6

bisect_left(a, x)のすべての要素が 未満であり、 のすべての要素が 以上pであるような位置を返します。これはまさに下限に必要なものです。a[:p]xa[p:]x

bisect_rightpのすべての要素a[:p]が より小さいか等しくxa[p:]すべてが より大きい位置を返しますx。したがって、右の境界については、1 を引いて最大の位置を取得する必要があります<= x

于 2013-09-11T18:56:35.290 に答える
3

numpy を使用できる場合:

import numpy as np
data = np.array([0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9])
max_b = .75
min_b = .25
wh = np.where((data < max_b)*(data > min_b))[0]
left, right =  wh[0], wh[-1] + 1

または単に(dougalに感謝):

left, right = np.searchsorted(data, [min_b, max_b])

できない場合:

import bisect

data = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9]
max_b = .75
min_b = .25
left = bisect.bisect_left(data, min_b)
right = bisect.bisect_right(data, max_b)

data[right]セットに参加するか、セットを提供するかに応じて、右側にプラスまたはマイナス 1 を付けdata[left:right]ます。

于 2013-09-11T18:55:16.207 に答える