2016-11-08 6 views
0

npの2次元配列の要素値の変更に関する質問があります。ここでは、例を持っている:python np array forループの要素値を変更します

a=np.arange(10).reshape(2,5) 
for i in a: # go through the rows of array 
    i=np.array([0,0,0,0,0]) 

print a 

戻り値は、元の配列には変化がないことを意味

array([[0, 1, 2, 3, 4], 
     [5, 6, 7, 8, 9]]) 

あります。 forループのiが配列aの各行のコピーであることを意味しますか?私がコピーであれば、コピーの変更が元の値に影響しないので意味があります。しかし、私は次のコードを試してください:[:]私はコピーである場合は、ここで働くことができる

a=np.arange(10).reshape(2,5) 
for i in a: # go through the rows of array 
    i[:]=np.array([0,0,0,0,0]) 

print a 

をリターン結果は、私はなぜ私が理解don'y

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

です。この質問が重複する場合は、リンクを提供してください。おかげさまで

答えて

0

iはコピーではありません。 forループは反復可能なアイテムをターゲットリスト(inの左側)に繰り返し割り当てます。各反復において、iは、それぞれサブアレイの参照をaに保持しています。ここで

for i in a: 
    i = np.array([0,0,0,0,0]) 

あなたが名前iaに各サブアレイを割り当て、直後に完全に無関係なオブジェクトに名前を割り当てます。そのループでi = 'unrelated'を試してみて、新しい文字列オブジェクトにiを割り当てる以外の効果はありません(私はaを意味します)。

第二のケースは、(最初​​の場合と同様に)連続してiaでサブアレイを割り当てるが、その後参照i介し代わりに変更を行います。

i = a[0] 
i[:] = np.array([0,0,0,0,0]) 

そして、第2の反復: をより明確に、第二のケースの最初の反復は、同じである

i = a[1] 
i[:] = np.array([0,0,0,0,0]) 

注意また、第2の反復i = a[1]に最初からの遷移に変更しない方法以前の参照a[0]ではなく、名前iを新しいオブジェクトa[1]に再割り当てします。

+0

お返事ありがとうございます。_インプレイス_変更の意味はどうですか?私はaの要素への参照を保持することに同意します。つまり、iとaは同じメモリアドレスを持ちます。 forループに 'i = np.array([0,0,0,0,0])'を代入すると、iとnp.array([0,0,0,0,0])に同じメモリアドレス、次にiとaは同じメモリアドレスを持っていません。だから私の修正はaに影響しません。そうですか? –

+0

インデックス 'x'の値を変更するために' a [x] = 1'を行うのと同じように、リストをカバーするスライスを使ってリスト全体を同じように(同じオブジェクトを意味する) [:] = [...] '。はい、私は正しく言うでしょう –

関連する問題