當我使用索引一次更改值時,它會起作用。但是,當我使用索引兩次更改值時,沒有任何變化。為什么我不能兩次使用索引來更改值?
import numpy as np
a = np.arange(100)
a[np.array([10,20,30,40,50])] = 1
print(a[np.array([10,20,30,40,50])])
# array([1, 1, 1, 1, 1]) which can be modified as 1
a = np.arange(100)
(a[np.array([10,20,30,40,50])])[np.array([1,2,3])] = 1
print((a[np.array([10,20,30,40,50])])[np.array([1,2,3])])
# array([20, 30, 40]) which can not be modified as 1
uj5u.com熱心網友回復:
這是一個關于 NumPy 中的視圖和副本的令人困惑的問題。我發現這個問題[Numpy: views vs copy by slicing] 與這個問題類似,@Maltimore 提到的這個檔案[NumPy 中的視圖與副本]可以解釋。
NumPy 花式索引回傳 numpy 陣列的副本而不是視圖。
但是,當使用花哨的索引將值設定為 numpy 陣列時,python 解釋器所做的是呼叫__setitem__函式。以代碼為例。
在這一行:
a[np.array([10,20,30,40,50])] = 1
python實際上做的是
a.__setitem__(np.array([10,20,30,40,50]), 1)
即不需要創建視圖或副本,因為可以就地評估該方法(即不涉及創建新物件)。
將此行拆分為以下代碼:
# (a[np.array([10,20,30,40,50])])[np.array([1,2,3])] = 1
a_copy = a[np.array([10,20,30,40,50])]
a_copy[np.array([1,2,3])] = 1
print(a[np.array([10,20,30,40,50])])
# [10, 20, 30, 40, 50]
print(a_copy)
# [10, 1, 1, 1, 50]
結果這一行修改了copy的值,所以原來的numpy陣列不變。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/400553.html
下一篇:Python無法識別numpy
