Python 以numpy为单位的arr[范围(3)]与arr[:3]之差

Python 以numpy为单位的arr[范围(3)]与arr[:3]之差,python,Python,我有一个简单的脚本代码,所以我不知道为什么numpy中的元素不交换。 多谢各位^^ import numpy as np arr = np.arange(10) a = arr[range(3)] b = arr[:3] c = arr[3:6] # Can swap arr[range(3)], arr[3:6] = arr[3:6],arr[range(3)] # Can't swap arr[:3], arr[3:6] = arr[3:6],arr[:3] numpy中的基本切

我有一个简单的脚本代码,所以我不知道为什么numpy中的元素不交换。 多谢各位^^

import numpy as np

arr = np.arange(10)

a = arr[range(3)]
b = arr[:3]
c = arr[3:6]

# Can swap
arr[range(3)], arr[3:6] = arr[3:6],arr[range(3)] 

# Can't swap
arr[:3], arr[3:6] = arr[3:6],arr[:3]

numpy中的基本切片是数组部分的视图,而高级索引创建数组相关部分的副本

从:

高级索引始终返回数据的副本(与 返回视图的基本切片)

arr[range(3)]
是高级索引的一个示例。如果尝试分配给
a
的元素,可以看到这一点:

>>> arr = np.arange(10)
>>> a = arr[range(3)]
>>> a[0] = 11
>>> a
array([11,  1,  2])
>>> arr
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
相比之下,
arr[:3]
是一个基本切片,它提供了阵列的视图:

>>> arr = np.arange(10)
>>> b = arr[:3]
>>> b[0] = 11
>>> b
array([11,  1,  2])
>>> arr
array([11,  1,  2,  3,  4,  5,  6,  7,  8,  9])
尝试使用数组的两个视图交换不起作用,因为临时元组同样包含数组的两个视图。您没有单独的数据临时副本,这是正确执行交换所需的

事实上,要正确执行交换,您不需要在赋值的左侧使用高级索引。仅在右侧进行即可:

>>> arr = np.arange(10)
>>> arr[:3], arr[3:6] = arr[3:6],arr[range(3)] 
>>> arr
array([3, 4, 5, 0, 1, 2, 6, 7, 8, 9])
或复制:

>>> arr = np.arange(10)
>>> arr[:3], arr[3:6] = arr[3:6],arr[:3].copy()
>>> arr
array([3, 4, 5, 0, 1, 2, 6, 7, 8, 9])

谢谢你的回答,我能问你一个问题吗?当我改变c[1]>>>arr=[1,2,3,4,5,6]>>c=arr[:]>>>c[1]=4时,list arr仍然保留值。print arr=[1,2,3,4,5,6]@superbrain我将用“相似”而不是“同样”来重新表述。我的意思是“也”如“就像上面的例子一样”,而不是“除了同一个语句中的其他内容”。@Quang.tpa您的
arr
在注释中的例子是一个列表,而不是numpy数组。尝试使用
arr=np.array([1,2,3,4,5,6])
,您将看到不同之处。列表的各个部分都是副本。您是否可以展开讨论
尝试使用数组的两个视图进行交换不起作用…
?为什么同一数组的两个视图不能保存在堆栈上?@yatu这些视图就是:视图。即使这些切片数组对象保存在某个位置,例如临时的2元素元组,在提取值时它们仍然指向原始数组对象。一旦您将
arr[3:6]
复制到
arr[:3]
中,您就不再拥有
arr[:3]
的原始内容。