我偶爾使用numpy
,我試圖變得更聰明我如何矢量化操作。我讀了一些代碼,並試圖瞭解以下的語義:arr [:]在numpy中的賦值是什麼意思?
arr_1[:] = arr_2
在這種情況下,
我明白,在arr[:, 0]
,我們選擇陣列的第一列,但我不知道arr_1[:] = arr_2
和arr_1 = arr_2
之間有什麼區別
我偶爾使用numpy
,我試圖變得更聰明我如何矢量化操作。我讀了一些代碼,並試圖瞭解以下的語義:arr [:]在numpy中的賦值是什麼意思?
arr_1[:] = arr_2
在這種情況下,
我明白,在arr[:, 0]
,我們選擇陣列的第一列,但我不知道arr_1[:] = arr_2
和arr_1 = arr_2
之間有什麼區別
你的問題涉及基本的Python語法和numpy
特定細節的混合。在很多方面,列表是一樣的,但不完全一樣。
arr[:, 0]
返回arr
(視圖)的第一列中,arr[:,0]=10
設置一個列的值至10
arr[:]
返回arr
(alist[:]
返回一個列表的副本)。 arr[:]=arr2
執行現場更換;將arr
的值更改爲arr2
的值。根據需要廣播和複製arr2
的值。
arr=arr2
設置arr
變量指向的對象。現在arr
和arr2
指向相同的東西(無論是數組,列表還是其他)。複製所有數據
播放約與在交互式會話這些動作時
arr[...]=arr2
也適用。嘗試arr2
的形狀變化,以瞭解價值如何廣播。同時檢查id(arr)
以查看變量指向的對象。和arr.__array_interface__
來查看數組的數據緩衝區。這有助於您將視圖與副本區分開來。
使用arr_1[:] = arr_2
是arr_1.__setitem__(slice(None, None), arr_2)
的快捷方式。使用原因而不是arr_1 = arr_2
是當您使用__setitem__
時,您正在修改arr_1
,而當您說arr_1 = arr_2
時,您正在重新定義arr_1
。因此,使用__setitem__
將修改其他對arr_1
對象的引用,而不僅僅是重新定義arr_1
。
arr_1[:] = ...
更改arr_1
所指的現有列表對象的元素。
arr_1 = ...
使名稱arr_1
指的是不同列表對象。
主要區別是,如果某些其他名稱也稱爲原始列表對象,會發生什麼情況。如果是這樣的話,那麼前者會更新這兩個名稱所指的東西;而後者則改變了某個名稱所指的意思,而另一個則指的是原來的意思。
>>> a = [0]
>>> b = a
>>> a[:] = [1]
>>> print(b)
[1] <--- note, change reflected by a and b
>>> a = [2]
>>> print(b)
[1] <--- but now a points at something else, so no change to b
也許最好通過使用id
來檢查每個變量的內存位置。
import numpy as np
arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])
>>> id(arr1)
4595568512
>>> id(arr2)
4595566192
# Slice assignment
arr1[:] = arr2
>>> arr1
array([4, 5, 6])
>>> id(arr1) # The object still points to the same memory location of `arr1`.
4595568512
# Reassignment.
arr1 = arr2
>>> id(arr1) # The object is now pointing to the object located to where `arr2` points.
4595566192
問題是關於'numpy'數組,而不是一個列表,雖然這個想法是一樣的 - 改變元素與改變變量指針。 'arr [:,0]'對列表無效。 – hpaulj