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