teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

補足加筆

2018/06/09 01:45

投稿

tachikoma
tachikoma

スコア3601

answer CHANGED
@@ -16,4 +16,31 @@
16
16
  k *= sim[i,min_n]
17
17
  sim[i,:] -= k
18
18
  print(sim)
19
- ```
19
+ ```
20
+
21
+ ----
22
+ 説明
23
+
24
+ 問題箇所は次の部分です。
25
+ ```python
26
+ k = sim[min_gen_m,:]
27
+ k *= sim[i,min_n]
28
+ sim[i,:] -= k
29
+ ```
30
+ ここで`k`は行列のコピーだとしてコードを書いていると思いますが、実際にはコピーせずに元のsimの一部分への参照が`k`に代入されています。これは次のようなコードで試すとよく分かると思います。
31
+ ```Python
32
+ a = np.arange(4).reshape(2, 2)
33
+
34
+ a0 = a[0, :] # 一行目のスライスをa0に代入
35
+ print(a) # 中身の確認
36
+ # [[0 1]
37
+ # [2 3]]
38
+ print(a0) # 中身の確認
39
+ # [0 1]
40
+
41
+ a0 += 10 # a0という新しい行列だけを操作しているつもりが・・・
42
+ print(a) # 元の配列がされてしまう。
43
+ # [[10 11]
44
+ # [ 2 3]]
45
+ ```
46
+ 参照を返さないようにするには、明示的に行列のコピーを作らせる必要があります。これが`.copy()`メソッドを呼ばなければならない理由です。