NumPy配列内の要素の符号の変化を検出する方法 質問する

NumPy配列内の要素の符号の変化を検出する方法 質問する

正の値と負の値を含む NumPy 配列があります。

a = array([1,1,-1,-2,-3,4,5])

符号の変更が発生する各インデックスの値を含む別の配列を作成したいと思います (たとえば、現在の要素が正で、前の要素が負の場合、またはその逆の場合)。

上記の配列の場合、次のような結果が得られると予想されます。

array([0,0,1,0,0,1,0])

あるいは、配列内で符号が変化する位置のリスト、または 0 と 1 の代わりにブール値のリストでもかまいません。

ベストアンサー1

何かのようなもの

a = array([1,1,-1,-2,-3,4,5])
asign = np.sign(a)
signchange = ((np.roll(asign, 1) - asign) != 0).astype(int)
print signchange
array([0, 0, 1, 0, 0, 1, 0])

さて、numpy.rollは循環シフトを行うので、最後の要素が最初の要素と異なる符号を持つ場合、符号変更配列の最初の要素は1になります。これが望ましくない場合は、もちろん単純な

signchange[0] = 0

また、np.sign は 0 が正または負の値とは異なる独自の符号を持つとみなします。たとえば、[-1,0,1] の「signchange」配列は、ゼロ線が 1 回だけ「交差」した場合でも [0,1,1] になります。これが望ましくない場合は、次の行を挿入できます。

sz = asign == 0
while sz.any():
    asign[sz] = np.roll(asign, 1)[sz]
    sz = asign == 0

最初の例の 2 行目と 3 行目の間。

おすすめ記事