gpt4 book ai didi

python - arr[range(3)] 与 arr[ :3] in numpy 的差异

转载 作者:行者123 更新时间:2023-12-04 08:57:25 25 4
gpt4 key购买 nike

我有一个脚本简单的代码,所以我不知道为什么 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 中的基本切片是 浏览次数 部分数组,而高级索引创建 复制 数组的相关部分。
来自 documentation :

Advanced indexing always returns a copy of the data (contrast withbasic slicing that returns a view).

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]是一个基本切片,并给出了数组的 View :
>>> 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])
尝试使用数组的两个 View 进行交换是行不通的,因为临时元组同样包含数组的两个 View 。您没有单独的数据临时副本,这是正确执行交换所需要的。
事实上,要正确执行交换,您不需要分配左侧的高级索引。仅在右侧执行此操作就足够了:
>>> 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])

关于python - arr[range(3)] 与 arr[ :3] in numpy 的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63739275/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com