回答編集履歴

1

補足加筆

2018/06/09 01:45

投稿

tachikoma
tachikoma

スコア3601

test CHANGED
@@ -35,3 +35,57 @@
35
35
  print(sim)
36
36
 
37
37
  ```
38
+
39
+
40
+
41
+ ----
42
+
43
+ 説明
44
+
45
+
46
+
47
+ 問題箇所は次の部分です。
48
+
49
+ ```python
50
+
51
+ k = sim[min_gen_m,:]
52
+
53
+ k *= sim[i,min_n]
54
+
55
+ sim[i,:] -= k
56
+
57
+ ```
58
+
59
+ ここで`k`は行列のコピーだとしてコードを書いていると思いますが、実際にはコピーせずに元のsimの一部分への参照が`k`に代入されています。これは次のようなコードで試すとよく分かると思います。
60
+
61
+ ```Python
62
+
63
+ a = np.arange(4).reshape(2, 2)
64
+
65
+
66
+
67
+ a0 = a[0, :] # 一行目のスライスをa0に代入
68
+
69
+ print(a) # 中身の確認
70
+
71
+ # [[0 1]
72
+
73
+ # [2 3]]
74
+
75
+ print(a0) # 中身の確認
76
+
77
+ # [0 1]
78
+
79
+
80
+
81
+ a0 += 10 # a0という新しい行列だけを操作しているつもりが・・・
82
+
83
+ print(a) # 元の配列がされてしまう。
84
+
85
+ # [[10 11]
86
+
87
+ # [ 2 3]]
88
+
89
+ ```
90
+
91
+ 参照を返さないようにするには、明示的に行列のコピーを作らせる必要があります。これが`.copy()`メソッドを呼ばなければならない理由です。