Python 在numpy的转让中,arr[:]的含义是什么?

Python 在numpy的转让中,arr[:]的含义是什么?,python,arrays,numpy,Python,Arrays,Numpy,我偶尔会使用numpy,我正试图在如何矢量化操作方面变得更聪明。我正在阅读一些代码并试图理解以下内容的语义: arr_1[:] = arr_2 在这种情况下, 我知道在arr[:,0]中,我们选择了数组的第一列,但我不清楚arr\u 1[:]=arr\u 2和arr\u 1=arr\u 2之间的区别是什么,使用arr\u 1[:]=arr\u 2是arr\u 1的快捷方式。使用arr\u 1=arr\u 2而不是arr\u 2的原因是,当您使用\uuu setitem\uuuu时,您正在修改a

我偶尔会使用
numpy
,我正试图在如何矢量化操作方面变得更聪明。我正在阅读一些代码并试图理解以下内容的语义:

arr_1[:] = arr_2
在这种情况下,


我知道在
arr[:,0]
中,我们选择了数组的第一列,但我不清楚
arr\u 1[:]=arr\u 2
arr\u 1=arr\u 2
之间的区别是什么,使用
arr\u 1[:]=arr\u 2
arr\u 1的快捷方式。使用
arr\u 1=arr\u 2
而不是
arr\u 2
的原因是,当您使用
\uuu setitem\uuuu
时,您正在修改
arr\u 1
,而当您说
arr\u 1=arr\u 2
时,您正在重新定义
arr\u 1
。因此,使用
\uuuu setitem\uuuuuu
将修改对
arr\u 1
对象的其他引用,而不仅仅是重新定义
arr\u 1
arr\u 1[:]=…
更改
arr\u 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
>a=[0]
>>>b=a
>>>a[:]=[1]
>>>印刷品(b)
[1] >>a=[2]
>>>印刷品(b)

[1] 也许最好通过使用
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

您的问题涉及基本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.\uuuu数组\u接口\uuuu
查看数组的数据缓冲区。这有助于区分视图和副本。

问题是关于
numpy
数组,而不是列表,尽管想法是一样的-更改元素还是更改变量指针<代码>arr[:,0]
对于列表无效。