我正在學習 NumPy(和 Python)并完成一些有關陣列的練習。我提出了一個我無法理解的問題。我了解以下代碼應更新b
指向的原始陣列。代碼如下。
a = np.zeros((4,5))
b = a[1:3,0:3]
b = b 100
print('a = ', a)
print('b = ', b)
輸出是:
a = [[0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0.]]
b = [[100. 100. 100.]
[100. 100. 100.]]
為什么不a
一起更新b
?我知道指標物件應該通過編輯來更新原始物件。我假設這是由于將 100 添加到b
. 正如我所想,下面的代碼隨著原始陣列的變化而更新。有什么區別?
a = np.zeros((4,5))
b = a[1:3,0:3]
b[0, 0] = 100
print('a = ', a)
輸出:
a = [[ 0. 0. 0. 0. 0.]
[100. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0.]
[ 0. 0. 0. 0. 0.]]
uj5u.com熱心網友回復:
Python 沒有指標,至少在 C 等其他語言的意義上沒有。
這里發生的情況是,當您索引一個陣列時,即a[1:3,0:3]
,您在a
.
關于視圖是什么的 Numpy 檔案
在您的第一個示例中,然后評估b 100
,這將創建一個新陣列。將結果分配給相同的變數名這一事實不會改變這種行為b
。
在您的第二個示例b[0, 0] = 100
中,您b
就地修改。由于b
只是 的一個視圖a
,您還可以修改 的相應條目a
。
你可以重寫你的第一個例子來b = 100
代替,它再次b
就地修改并且也會改變a
uj5u.com熱心網友回復:
在第一個代碼塊中,您將值設定為b
等于 之前的值,并將其所有值加 100。
b = b 100
在第二個代碼塊中,您將[0, 0]
位置中的數字的值設定為等于 100。由于b
只是指向 的指標a
,因此它還修改了 的值a
b[0, 0] = 100
兩者之間的區別在于,在第一個中您要克隆b
然后對其進行修改(然后將其分配給b
)。在第二個中,您不克隆它,而只是對其進行修改。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/507381.html
上一篇:在Python中跳過某些檔案夾