我偶尔使用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