2016-07-18 4 views
1

選択を変異numpyの:私は、配列の3番目のエントリを変異させたいのpython iはnumpyの中で奇妙なバグに遭遇した

array([[ 1., 2., 3.], 
    [-4., -5., -6.], 
    [ 1., 2., -4.]], dtype=float32) 

ある

p = np.asarray([[1., 2., 3.], [-4., -5., -6.], [1,2,-4]], dtype=np.float32) 

: は、ネストされた配列を考えます条件付きのような

ただし、最後の文は変更されません。 私は

array([[ 1., 2., 3.], 
    [-4., -5., 6.], 
    [ 1., 2., 4.]], dtype=float32) 

のように出力のために願っていますが、実際にはまったく何もしません。 pは変化しない。 私は多くのことをテストしましたが、なぜpが突然変異しないのか結論には至りません。

もちろん、私は何とかこれを回避することができますが、これは私にとっては奇妙に思えます。 お早めに感謝します。 ダニエル

+0

角括弧の順序を逆にすると、 'p [:, 2] [p [:, 2] <0] * = -1'になります。ブール索引付けは、割り当てを行っていない限り、コピーを返します。これは、最後の索引付け操作にすることで実現できます。 – Jaime

+0

これは私の質問に対する答えです。私はこれを正しいとマークしたいと思います:) –

+0

これで、あなたが受け入れる答えです。 ;-) – Jaime

答えて

2

のようなものは、それを修正する必要があります:あなたはそれが最後の可能せることによって達成することができた、それに割り当てを行っている場合を除き

p[:, 2][p[:, 2] < 0] *= -1 

ブールインデックスは、コピーを返します。インデックス作成操作。

0

元の配列のコピーを変更しました。

p[p[:, 2] <0, 2] *= -1 
0

p[boolean_array]はコピーを返しますので、あなたのコピーを変更しますが、あなたのオリジナルの未変更のままに:あなたは、元の配列を変化させたい場合は、このようなものを使用する必要があります。たとえば、代わりにnp.whereを使用できます。あなたの角括弧の順序を逆にp[:,2] = np.where(p[:,2], p[:,2], -p[:,2])

関連する問題