と同様のことを実行しようとしていますsearchsorted
が、配列が完全に単調ではない場合です。スカラーc
と1D配列があるとすると、のようなすべての要素x
のインデックスを見つけたいと思います。重要なのは、完全に単調ではないということです。i
x[i] < c <= x[i + 1]
x
次のコードは機能しますが、これがこれを行うための最も効率的な方法であるかどうか、またはより簡単な方法があるかどうかを知りたいだけです。
x = np.array([1,2,3,1,2,3,1,2,3])
c = 2.5
t = c > x[:-1]
u = c <= x[1:]
v = t*u
i = v.nonzero()[0]
または1行のコードで:
i = ( (c > x[:-1]) * (c <= x[1:] ).nonzero()[0]
これは、これらのインデックスを回復するための最も効率的な方法ですか?
2つの追加の質問。
がc
1D配列で、x
が2D配列で、のc
「行」x
と同じ数の要素がありc
、の対応する「行」のの各要素に対してこの検索を実行する場合に、これを拡張する簡単な方法はありx
ますか?
私の最終的な目標は、3次元のケースでこれを行うことです。つまりc
、n
要素を含む1Dベクトルであるとします。さて、聞かせてx
寸法の3次元配列、ことj
によるn
によりますk
。の各「部分行列」に対して上記の#1を実行する方法はありx
ますか?基本的に、上記の#1を実行しj
ます。
例えば:
x1 = np.array([1,2,3,1,2,3],[1,2,3,1,2,3],[1,2,3,1,2,3])
x2 = x1 + 1
x = np.array([x1,x2])
c = np.array([1.5,2.5,3.5])
上記の#1で、cとx1を比較すると、次のようになります。 [[0,4],[1,5],[]]
cとx2を比較すると、次のようになります。 [[],[0,4],[1,5]]
最後に、#2の下で、私は取得したいと思います:
[[[0,4],[1,5],[]],
[[],[0,4],[1,5]]]
一度比較してブールマスクを取得し、それを否定で再利用して他の比較配列を取得し、スライスを使用することもできます-
m = c > x
i = np.flatnonzero( m[:-1] & ~m[1:] )
我々はそれを拡張することができるx
ように2D
とc
のように1D
ループを有する場合、そのようにように、ベクトル化方法でマスクの生成に事前計算することによって、それに最小の計算を行います-
m = c[:,None] > x
m2 = m[:,:-1] & ~m[:,1:]
i = [np.flatnonzero( mi ) for mi in m2]
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加