2016-03-01 76 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