Pythonのnumpy配列のfor文における値変更について自力では解決できない疑問がありますので、質問させて頂きます。
###疑問点
例えば、以下のようなnumpyの2次元のリストがあったとします。
python
1In [1]: import numpy as np 2 3In [2]: twodim_array = np.arange(9).reshape(3,3) 4 5In [3]: twodim_array 6Out[3]: 7array([[0, 1, 2], 8 [3, 4, 5], 9 [6, 7, 8]])
これをfor文で回して、中のリストの値を変更しようとすると、以下のように元のリスト(twodim_array)の内容が変更される事が確認できます。
python
1In [4]: for array in twodim_array: 2 ...: array[1] = 5 3 ...: 4 5In [5]: twodim_array 6Out[5]: 7array([[0, 5, 2], 8 [3, 5, 5], 9 [6, 5, 8]]) 10 11In [6]:
しかし、例えば以下のように要素がintの配列の中身を変えようとしても、元の配列の内容は変更されません。
python
1In [7]: onedim_array = np.arange(3) 2 3In [8]: onedim_array 4Out[8]: array([0, 1, 2]) 5 6In [9]: for int_val in onedim_array: 7 ...: int_val = 5 8 ...: 9 10In [10]: onedim_array 11Out[10]: array([0, 1, 2]) 12 13In [11]:
この2つの違いは何でしょうか。
前者は、listの中身がmutable,後者はimmutableである事かと思い、以下のように確認してみましたが、謎が深まるばかりで理解できませんでした。
###考察
for文によって参照されているオブジェクトが元のオブジェクトかどうか??
python
1In [11]: for array in twodim_array: 2 ...: print(id(array)) 3 ...: 44674307536 54674308736 64674307536 7 8In [12]: for array in twodim_array: 9 ...: print(id(array)) 10 ...: 114673935360 124674307536 134673935360 14 15In [13]: for array in twodim_array: 16 ...: print(id(array)) 17 ...: 184674557392 194673935360 204674557392 21 22In [14]: 23 24In [14]: id(twodim_array[0]) 25Out[14]: 4673766544 26 27In [15]: id(twodim_array[1]) 28Out[15]: 4673936160 29 30In [16]: id(twodim_array[2]) 31Out[16]: 4585491872 32 33In [17]:
要素がnumpyであるnumpy配列(2次元)のfor文によって参照されるオブジェクトは、元のオブジェクトと違うようですし、しかも、毎回別のものが参照されている。
そして、さらに分からないのが、for文の中で0番目と2番目のオブジェクトIDが同じ番号になっている!
以下のように、intを要素にもつnumpy配列でも似たような結果となりました。
python
1In [17]: for int_val in onedim_array: 2 ...: print(id(int_val)) 3 ...: 44671588584 54671588608 64671588584 7 8In [18]: for int_val in onedim_array: 9 ...: print(id(int_val)) 10 ...: 114671588632 124671588584 134671588632 14 15In [19]: for int_val in onedim_array: 16 ...: print(id(int_val)) 17 ...: 184671588656 194671588632 204671588656 21 22In [20]: id(onedim_array[0]) 23Out[20]: 4671588680 24 25In [21]: id(onedim_array[1]) 26Out[21]: 4671588704 27 28In [22]: id(onedim_array[2]) 29Out[22]: 4671588728 30 31In [23]:
まとめ
以下の点を含めて、説明できる方がいらっしゃいましたら、教えていただけないでしょうか。。。
・for文でのオブジェクトidと[int]で参照した時のオブジェクトidが違うのに、何故、元のリストの値を更新する事ができるのか。。
・for文の中で0番目と2番目のオブジェクトidが等しいのは何故か。
・intを要素に持つnumpy配列は、for文によって元のnumpy配列の値を変更する事はできないが、numpyを要素に持つnumpy配列は、for文によって元の配列を変更できるのは何故か。。
よろしくお願いいたします。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/01/04 07:09
2018/01/04 15:29 編集
2018/01/04 08:40
2018/01/04 09:13
2018/01/04 14:09
2018/01/04 14:35
2018/01/04 14:46
2018/01/04 15:15 編集
2018/01/04 15:28
2018/01/05 08:07
2018/01/05 08:13
2018/01/05 08:32
2018/01/05 09:10
2018/01/20 08:16