2016-03-01 53 views
2

我偶爾使用numpy,我試圖變得更聰明我如何矢量化操作。我讀了一些代碼,並試圖瞭解以下的語義:arr [:]在numpy中的賦值是什麼意思?

arr_1[:] = arr_2 

在這種情況下,

我明白,在arr[:, 0],我們選擇陣列的第一列,但我不知道arr_1[:] = arr_2arr_1 = arr_2之間有什麼區別

回答

3

你的問題涉及基本的Python語法和numpy特定細節的混合。在很多方面,列表是一樣的,但不完全一樣。

arr[:, 0]返回arr(視圖)的第一列中,arr[:,0]=10設置一個列的值至10

arr[:]返回arralist[:]返回一個列表的副本)。 arr[:]=arr2執行現場更換;將arr的值更改爲arr2的值。根據需要廣播和複製arr2的值。

arr=arr2設置arr變量指向的對象。現在arrarr2指向相同的東西(無論是數組,列表還是其他)。複製所有數據

播放約與在交互式會話這些動作時

arr[...]=arr2也適用。嘗試arr2的形狀變化,以瞭解價值如何廣播。同時檢查id(arr)以查看變量指向的對象。和arr.__array_interface__來查看數組的數據緩衝區。這有助於您將視圖與副本區分開來。

2

使用arr_1[:] = arr_2arr_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

4

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 
+0

問題是關於'numpy'數組,而不是一個列表,雖然這個想法是一樣的 - 改變元素與改變變量指針。 'arr [:,0]'對列表無效。 – hpaulj

2

也許最好通過使用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 
相關問題