NumPy 基本切片和索引(二)

简介: ndarrays可以使用标准Python x[obj]语法对其进行索引 ,其中x是数组,obj是选择方式。有三种可用的索引:字段访问,基本切片,高级索引。究竟是哪一个取决于obj。

高级索引


当选择对象obj是非元组序列对象,ndarray(数据类型为整数或bool)或具有至少一个序列对象或ndarray(数据类型为integer或bool)的元组时,将触发高级索引。高级索引有两种类型:整数和布尔值。

高级索引始终返回数据的副本(与返回视图的基本切片形成对比)。


警告

高级索引的定义意味着x[(1,2,3),]根本不同于x[(1,2,3)]。后者相当于x[1,2,3]触发基本选择,而前者将触发高级索引。一定要明白为什么会这样。

同时认识到x[[1,2,3]]将触发高级索引,而由于上面提到的不推荐的数字兼容性, x[[1,2,slice(None)]]将触发基本切片。


整数数组索引

整数数组索引允许根据数组的N维索引选择数组中的任意项。每个整数数组表示该维度的许多索引。


纯整数数组索引

当索引包含尽可能多的整数数组时,索引的数组具有维度,索引是直接的,但与切片不同。

高级索引始终作为一个广播和迭代:

result[i_1, ..., i_M] == x[ind_1[i_1, ..., i_M], ind_2[i_1, ..., i_M],

                          ..., ind_N[i_1, ..., i_M]]

请注意,结果形状与(广播)索引数组形状相同。ind_1, ..., ind_N


从每一行开始,应选择一个特定元素。行索引是just ,列索引指定要为相应行选择的元素。将两者结合使用可以使用高级索引解决任务:0, 1, 2

>>>
>>> x = np.array([[1, 2], [3, 4], [5, 6]])
>>> x[[0, 1, 2], [0, 1, 0]]
array([1, 4, 5])

为了实现类似于上面的基本切片的行为,可以使用广播。该功能ix_可以帮助这种广播。通过示例可以最好地理解这一点。


从4x3阵列中,应使用高级索引选择角元素。因此,列是其中之一的所有元素和行是需要选择的行。要使用高级索引,需要明确选择所有元素。使用前面解释的方法可以写:0, 2

>>>
>>> x = array([[ 0,  1,  2],
...            [ 3,  4,  5],
...            [ 6,  7,  8],
...            [ 9, 10, 11]])
>>> rows = np.array([[0, 0],
...                  [3, 3]], dtype=np.intp)
>>> columns = np.array([[0, 2],
...                     [0, 2]], dtype=np.intp)
>>> x[rows, columns]
array([[ 0,  2],
       [ 9, 11]])

但是,由于上面的索引数组只是重复自身,因此可以使用广播(比较诸如此类的操作 )来简化:rows[:, np.newaxis] + columns

>>>
>>> rows = np.array([0, 3], dtype=np.intp)
>>> columns = np.array([0, 2], dtype=np.intp)
>>> rows[:, np.newaxis]
array([[0],
       [3]])
>>> x[rows[:, np.newaxis], columns]
array([[ 0,  2],
       [ 9, 11]])


这种广播也可以使用以下功能实现ix_:

>>>
>>> x[np.ix_(rows, columns)]
array([[ 0,  2],
       [ 9, 11]])


请注意,如果没有np.ix_调用,只会选择对角线元素,如上例所示。对于使用多个高级索引进行索引,这个差异是最重要的。

结合高级索引和基本索引

当至少有一个slice(:),省略号(...)或newaxis 索引(或者数组的维度多于高级索引)时,行为可能会更复杂。这就像连接每个高级索引元素的索引结果一样

在最简单的情况下,只有一个单一的指标先进。单个高级索引可以例如替换切片,并且结果数组将是相同的,但是,它是副本并且可以具有不同的存储器布局。当可能时,切片是优选的。

相关文章
|
16天前
|
BI 测试技术 索引
Python学习笔记之NumPy模块——超详细(安装、数组创建、正态分布、索引和切片、数组的复制、维度修改、拼接、分割...)-1
Python学习笔记之NumPy模块——超详细(安装、数组创建、正态分布、索引和切片、数组的复制、维度修改、拼接、分割...)
|
16天前
|
存储 API C语言
Python学习笔记之NumPy模块——超详细(安装、数组创建、正态分布、索引和切片、数组的复制、维度修改、拼接、分割...)-2
Python学习笔记之NumPy模块——超详细(安装、数组创建、正态分布、索引和切片、数组的复制、维度修改、拼接、分割...)
|
1月前
|
存储 索引 Python
NumPy 数组创建方法与索引访问详解
NumPy 的 `ndarray` 是其核心数据结构,可通过 `array()`、`zeros()`、`ones()` 和 `empty()` 函数创建。`array()` 可以将列表等转换为数组;`zeros()` 和 `ones()` 生成全零或全一数组;`empty()` 创建未定义值的数组。此外,还有 `arange()`、`linspace()`、`eye()` 和 `diag()` 等特殊函数。练习包括使用这些函数创建特定数组。
131 1
|
1月前
|
存储 数据挖掘 vr&ar
深入探索Numpy--索引,切片,随机数,文本操作等
深入探索Numpy--索引,切片,随机数,文本操作等
|
1月前
|
机器学习/深度学习 计算机视觉 索引
NumPy索引与切片的高级技巧探索
【4月更文挑战第17天】探索NumPy的高级索引与切片技巧:整数数组、布尔和花式索引用于灵活选取元素;切片步长、反转及多维切片操作实现高效数组处理。在数据分析、图像处理和机器学习等领域有广泛应用,提升代码效率与可读性。
|
1月前
|
数据处理 计算机视觉 索引
NumPy中的布尔索引与花式索引详解
【4月更文挑战第17天】本文介绍了NumPy中的布尔索引和花式索引,这两种高级索引方式增强了数组操作的灵活性。布尔索引利用布尔数组过滤数据,如`array[bool_array]`用于根据条件筛选元素;在数据分析中,这对条件筛选非常有用。花式索引包括切片、数组和元组索引,允许非整数位置访问元素。例如,数组索引`array[index_array]`按指定位置选取元素,元组索引适用于多维数组的选择。掌握这两种索引能提升数组数据处理的效率。
|
1月前
|
存储 索引 Python
NumPy 数组切片及数据类型介绍
了解 NumPy 数组切片,用于从数组中提取子集。一维数组切片使用 `start:end:step`,如 `arr[1:5]`。二维数组切片如 `arr[1:3, 0:3]`。创建 5x5 数组并练习切片,例如打印第一行、第二列、对角线元素和 2x2 子数组。别忘了检查数据类型,如 `arr.dtype`,并使用 `astype()` 转换类型。
48 0
|
1月前
|
存储 机器学习/深度学习 数据处理
NumPy:从初识到实战,探索Python科学计算的无限可能
NumPy:从初识到实战,探索Python科学计算的无限可能
45 0
|
1月前
|
程序员 开发工具 索引
图解Python numpy基本操作
图解Python numpy基本操作
|
12天前
|
Python
NumPy 是 Python 中的一个重要的科学计算包,其核心是一个强大的 N 维数组对象 Ndarray
【6月更文挑战第18天】NumPy的Ndarray是科学计算的核心,具有ndim(维度数)、shape(各维度大小)、size(元素总数)和dtype(数据类型)属性。方法包括T(转置)、ravel()(扁平化)、reshape()(改变形状)、astype()(转换数据类型)、sum()(求和)及mean()(计算平均值)。更多属性和方法如min/max等可在官方文档中探索。
34 5