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]
对于列表无效。