numpy数组双索引取值代码原理咨询:为何未生成新数组?
理解Numpy整数数组索引的工作机制
先帮你理清楚这段代码的执行逻辑,以及你疑惑的点:
首先,先把你的代码完整执行后的数组状态列出来,方便后续解释:
import numpy as np # 生成初始一维数组 arr = np.array(range(12)) # 重塑为4行3列的二维数组 arr = arr.reshape((4,3)) # 索引用的列数组(你定义的keys和后面用的索引值一致) keys = np.array([1,0,1,2]) # 执行索引操作 result = arr[np.arange(4), np.array([1,0,1,2])] print(result) # 输出: array([ 1, 3, 7, 11])
一、整数数组索引的核心逻辑
你提到的arr[np.arange(4), np.array([1,0,1,2])]属于Numpy的整数数组索引(Integer Array Indexing),它的工作方式是:
- 当你给二维数组传入两个长度相同的一维数组作为索引时,第一个数组对应行索引的集合,第二个数组对应列索引的集合
- Numpy会逐个配对两个数组中对应位置的元素,形成
(行索引i, 列索引i)的坐标对,然后提取每个坐标对对应的元素,最后把这些元素组合成一个新的一维数组
对应到你的代码里:
np.arange(4)生成的是[0,1,2,3],也就是4行的行索引(从0到3)- 第二个索引数组是
[1,0,1,2],是每一行要取的列索引 - 配对后的坐标对是:
(0,1)、(1,0)、(2,1)、(3,2) - 对应提取的元素就是:
arr[0,1] = 1arr[1,0] = 3arr[2,1] =7arr[3,2] =11
- 最终组合成结果数组
[1,3,7,11]
二、解答你的两个疑问
“我并未关联任何变量,调用np.array时它却能识别arr的索引”
你这里是误解了操作主体:不是np.array在识别arr的索引,而是arr的索引操作(方括号[])接收了两个Numpy数组作为参数。Numpy数组的__getitem__方法(也就是方括号索引背后的逻辑)会处理这种数组形式的索引,按照上面说的配对规则提取元素,和你有没有关联变量无关——只要传入的两个索引数组长度一致,就能触发这个逻辑。“为何未生成新数组?”
其实这段代码已经生成了新数组!你看到的输出array([ 1, 3, 7, 11])就是一个全新的Numpy数组,原数组arr并没有被修改。如果你把这个结果赋值给一个变量(比如上面代码里的result),就能直接使用这个新数组。这种索引取值操作本身就会返回新数组,不需要额外的“生成”操作。
内容的提问来源于stack exchange,提问作者Deuxbob
相关产品推荐
相关产品推荐

