Numpy 索引
索引、切片
基本切片、索引
基本切片
[Slice]start:stop:step
(基本同原生类型切片)start
、stop
负值时,按维度长取正模step>0
时,start
缺省为0
、stop
缺省为维度长N
step<0
时,start
缺省为N-1
、stop
缺省为-N-1
stop
、start
可以超过维度长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 | X = np.array([[0,1,2],[3,4,5],[6,7,8],[9,10,11]]) |
Boolean索引
Boolean索引
obj
选择其中True
处位置对应元素- 索引
obj
维数较数组X
小,直接抽取子数组作为元素 (可以理解为索引和数组高维对齐后广播) - 索引
obj
在超出数组X.shape
范围处有True
值,会引发 索引错误 - 索引
obj
在X.shape
内未填充处等同于填充False
- 索引
Boolean索引通过
.nonezero
方法转换为高级整数索引实现- Boolean索引等价于
True
数量长的1维整数索引X[..,bool_obj,..]
等价于X[..,bool_obj.nonzero(),..]
- Boolean索引总是削减对应索引,展开为1维
- Boolean索引、高级整数索引共同存在场合行为诡异
- Boolean索引转换为等价的整数索引
- 整数索引需要广播兼容转换后整数索引
- 整数索引、转换后整数索引整体得到结果
- Boolean索引等价于
- 索引
obj
和数组X
形状相同计算速度更快
字段名称形式访问
ndarray
中元素为结构化数据类型时,可以使用字符串索引 访问- 字段元素非子数组时
- 其shape同原数组
- 仅包含该字段数据
- 数据类型为该字段数据类型
- 字段元素为子数组时
- 子数组shape会同原数组shape合并
- 支持字符串列表形式访问
- 返回数组视图而不是副本(Numpy1.6后)
- 字段元素非子数组时