arr[:]在numpy中的赋值是什么意思?

2024-05-19 01:13:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我偶尔会使用numpy,并且我正在努力使操作矢量化。我正在阅读一些代码并试图理解以下内容的语义:

arr_1[:] = arr_2

在这种情况下

我知道在arr[:, 0]中,我们选择了数组的第一列,但是我对arr_1[:] = arr_2arr_1 = arr_2之间的区别感到困惑


Tags: 代码numpy语义情况数组矢量化arr区别
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__来查看数组的数据缓冲区。这有助于区分视图和副本。

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

使用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

相关问题 更多 >

    热门问题