2011-12-15 20 views
2

特定のインデックスにnanを挿入しようとしています。numpy.insert trouble

私は結果がなりたい
import numpy 
z = numpy.array([1., 1., 0., 0., 0., 2., 3., 4., 5., 6., 0., 7., 8., 9.]) 
a = z[z!=0] 
# Some processing magic happens to a but stays the same shape 
b = numpy.argwhere(z == 0).flatten() 
c = numpy.insert(a, b, numpy.nan) 

[1, 1, nan, nan, nan, 2, 3, 4, 5, 6, nan, 7, 8, 9] 

が、取得しています:

[1, 1, nan, 2, nan, 3, nan, 4, 5, 6, 7, 8, 9, nan] 

numpy.insertでこれを達成するための方法または別の組み込みのコマンドがあり、そうでない場合は、いいクリーンな回避策は何ですか?インデックスのリストは常に昇順になり、重複はありませんが、例のようにギャップがある可能性があります。

EDIT私の質問を編集している間、混乱して申し訳ありません。

+1

私は、最初の例の背後にあるロジック(希望する動作)にはほとんど従っていません。あなたはそれを説明できますか? – NPE

+0

たとえば、 'a 'は' a = z [z!= 0] 'から生成されます。 'a'は何らかの処理を経て変化し、元々ゼロがあったところに' nan'を挿入する必要があります。インデックスは 'b = numpy.argwhere(z == 0)'を使って簡単に取得できます。 – Benjamin

+0

しかし、最後の 'nan'は' 10'の位置にどうして終わりますか? – NPE

答えて

4

以下はそれを行います。ここでは

numpy.insert(a, b-numpy.arange(len(b)), numpy.nan) 

はあなたの例を完備しipythonセッションです:あなたが見ることができるようにゼロがにあった場所を正確に

In [87]: import numpy 

In [88]: z = numpy.array([1., 1., 0., 0., 0., 2., 3., 4., 5., 6., 0., 7., 8., 9.]) 

In [89]: a = z[z!=0] 

In [90]: b = numpy.argwhere(z == 0).flatten() 

In [91]: c = numpy.insert(a, b, numpy.nan) 

In [92]: numpy.insert(a, b - numpy.arange(len(b)), numpy.nan) 
Out[92]: 
array([ 1., 1., NaN, NaN, NaN, 2., 3., 4., 5., 6., NaN, 
     7., 8., 9.]) 

NaNsが表示されますz

+0

これは 'z [z == 0] = np.nan'でも実現できます。 –

+0

@larsmans:質問の私の理解は、もはや 'z'を持っていないということです。 'a'と' b'から再構成する必要があります( 'a'は' z'要素の変換の結果です)。 – NPE

+0

@aix:そうです。 – Benjamin