Numpy 索引

索引、切片

基本切片、索引

  • 基本切片[Slice]start:stop:step(基本同原生类型切片)

    • startstop负值时,按维度长取正模
    • step>0时,start缺省为0stop缺省为维度长N
    • step<0时,start缺省为N-1stop缺省为-N-1
    • stopstart可以超过维度长N
  • Ellipsis/...:放在切片中表示选择所有

    • ...存在的场合,结果总是数组而不是数组标量,即使其 没有大小
  • np.newaxis/None:为切片生成数组在所在位置添加长度为 1的维度

  • 切片可以用于设置数组中的值

  • 基本切片可认为是依次对各维度切片,若靠前维度为索引,则 可以把靠前维度独立出来
  • 基本切片生成的所有数组始终是原始数组的视图,也因此存在 切片引用的数组内存不会被释放
  • 注意:基本索引可用于改变数组的值,但是返回值不是对数组 中对应值的引用

高级索引

  • 选择对象为以下类型时会触发高级索引

    • 非元组序列
    • ndarray(整形或boolean类型)
    • 包含至少一个序列、ndarray(整型或boolean类型)的 元组
  • 高级索引总是返回数据的副本

    • 高级索引结果不能保证任何内存布局

整数索引

  • 整数索引X[obj]允许根据其各维度索引选择数组X任意元素

    • 各整数索引(数组)表示对应维度的索引
    • 各维度索引迭代、连接得到各元素位置:zip(obj*)
    • 索引维数小于数组维数时,以子数组作为元素 (可以理解为索引和数组高维对齐后广播)
  • 整数索引结果shape由obj中各维度索引shape决定

    • 整数索引obj中各维度索引数组会被广播
      • 各维度索引shape可能不同
      • 为保证各维度索引能正常迭代选取元素,各维度索引 shape需要能被广播、符合广播要求
    • 则高级索引出现场合
      • “普通索引(标量值)”不存在,必然被广播
      • 切片能够共存
  • 切片(包括np.newaxis)和高级索引共存时

    • 高级索引特点导致其结果维度不可割
      • “标量索引”本应削减该维度
      • 而高级索引整体(广播后)决定唯一shape
    • 高级索引结果维度应整体参与结果构建
      • 高级索引被切片分割:高级索引结果维度整体提前
      • 高级索引相邻:高级索引结果维度填充至该处
  • 高级索引操作结果中无元素,但单个维度索引越界的错误未定义
  • 高级索引结果内存布局对每个索引操作有优化,不能假设特定 内存顺序
1
2
3
4
5
6
7
8
X = np.array([[0,1,2],[3,4,5],[6,7,8],[9,10,11]])
rows = [0, 3]
cols = [0, 2]
# 整数索引
X[np.ix_(rows, cols)]
# 整数索引数组
X[[[1,2],[2,1]],:]
X.take([[1,2],[2,1]], axis=0)

Boolean索引

  • Boolean索引obj选择其中True处位置对应元素

    • 索引obj维数较数组X小,直接抽取子数组作为元素 (可以理解为索引和数组高维对齐后广播)
    • 索引obj在超出数组X.shape范围处有True值,会引发 索引错误
    • 索引objX.shape内未填充处等同于填充False
  • Boolean索引通过.nonezero方法转换为高级整数索引实现

    • Boolean索引等价于True数量长的1维整数索引
      • X[..,bool_obj,..]等价于 X[..,bool_obj.nonzero(),..]
      • Boolean索引总是削减对应索引,展开为1维
    • Boolean索引、高级整数索引共同存在场合行为诡异
      • Boolean索引转换为等价的整数索引
      • 整数索引需要广播兼容转换后整数索引
      • 整数索引、转换后整数索引整体得到结果
  • 索引obj和数组X形状相同计算速度更快

字段名称形式访问

  • ndarray中元素为结构化数据类型时,可以使用字符串索引 访问
    • 字段元素非子数组时
      • 其shape同原数组
      • 仅包含该字段数据
      • 数据类型为该字段数据类型
    • 字段元素为子数组时
      • 子数组shape会同原数组shape合并
    • 支持字符串列表形式访问
      • 返回数组视图而不是副本(Numpy1.6后)
Author

UBeaRLy

Posted on

2021-03-11

Updated on

2021-03-11

Licensed under

Comments