You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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] = 1
    • arr[1,0] = 3
    • arr[2,1] =7
    • arr[3,2] =11
  • 最终组合成结果数组[1,3,7,11]

二、解答你的两个疑问

  1. “我并未关联任何变量,调用np.array时它却能识别arr的索引”
    你这里是误解了操作主体:不是np.array在识别arr的索引,而是arr的索引操作(方括号[])接收了两个Numpy数组作为参数。Numpy数组的__getitem__方法(也就是方括号索引背后的逻辑)会处理这种数组形式的索引,按照上面说的配对规则提取元素,和你有没有关联变量无关——只要传入的两个索引数组长度一致,就能触发这个逻辑。

  2. “为何未生成新数组?”
    其实这段代码已经生成了新数组!你看到的输出array([ 1, 3, 7, 11])就是一个全新的Numpy数组,原数组arr并没有被修改。如果你把这个结果赋值给一个变量(比如上面代码里的result),就能直接使用这个新数组。这种索引取值操作本身就会返回新数组,不需要额外的“生成”操作。

内容的提问来源于stack exchange,提问作者Deuxbob

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:34:00