回答編集履歴
1
補足加筆
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()`メソッドを呼ばなければならない理由です。
|