Python 以numpy为单位的arr[范围(3)]与arr[:3]之差
我有一个简单的脚本代码,所以我不知道为什么numpy中的元素不交换。 多谢各位^^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中的基本切
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]
的原始内容。