整数の 2 つの Python リストがあります。リストはサイズが異なる可能性があります。1 つはデータセット内のすべての最大値のインデックスのリストで、もう 1 つはすべての最小値のインデックスのリストです。連続する最大値と最小値のリストを順番に作成し、たとえば 2 つの最大値の間に 2 分があるケースをスキップします。
速度が最も重要なので、次のことを最も迅速に実行する方法を尋ねています (Numpy を使用して、この回答some_function()
に似ていると思います):
>>> min_idx = [1,5,7]
>>> max_idx = [2,4,6,8]
>>> some_function(min_idx, max_idx)
[1, 2, 5, 6, 7, 8]
上記の例では、どの*_idx
リストがより低い値で始まるかを確認し、それを「最初」に選択しました ( min_idx
)。そこから、 と の間を行っmin_idx
たり来たりしてmax_idx
、「次に大きい数」を選びます。
- 1から始める
min_idx
- を見て
max_idx
、1: 2 より大きい最初の未使用の数値を見つけます。 - に戻って
min_idx
、2:5 より大きい最初の未使用の数値を見つけます。 - 再び
max_idx
: 4 は 5 未満であるためスキップし、6 を選択しました。 - いずれかのリストの値がなくなるまでプロセスを続行します。
別の例として、min_idx = [1,3,5,7,21]
とmax_idx = [4,6,8,50]
の場合、期待される結果は次のとおりです。[1,4,5,6,7,8,21,50]
私の現在の非 Numpy ソリューションは次のようにidx
なります。出力は次のとおりです。
# Ensure we use alternating mins and maxes
idx = []
max_bookmark = 0
if min_idx[0] < max_idx[0]:
first_idx = min_idx
second_idx = max_idx
else:
first_idx = max_idx
second_idx = min_idx
for i, v in enumerate(first_idx):
if not idx:
# We just started, so put our 1st value in idx
idx.append(v)
elif v > idx[-1]:
idx.append(v)
else:
# Go on to next value in first_idx until we're bigger than the last (max) value
continue
# We just added a value from first_idx, so now look for one from second_idx
for j, k in enumerate(second_idx[max_bookmark:]):
if k > v:
idx.append(k)
max_bookmark += j + 1
break
Numpy 配列のマージに関する他の回答とは異なり、ここでの難しさは、途中で 2 つのリスト間を 1 回ホップするときに要素の値を比較することです。
背景: 最小/最大リスト
上記の問題に対する 2 つの入力リストはscipy.argrelextrema
、最大値のインデックスを取得するために 1 回、最小値のインデックスを取得するために 2 回使用する必要があることによって生成されます。最終的には、交互の最大値と最小値のインデックスの単一のリストが必要なので、データセットの最大値と最小値を見つけて、交互の最大値と最小値を示すインデックスのリストを返すことができる scipy または numpy 関数があれば、それは私が何を解決するでしょうも探しています。