「Python数据科学」NumPy多维数组的索引与切片

南宫理的日志录 2024-12-20 08:13:19
引言

如同基于Python原生列表实现的数组一样,NumPy中的多维数组同样支持类似的索引与切片的操作方式。此外,NumPy的设计目标之一是为了更高效地处理大规模的数组运算,因此它的索引和切片机制相较于Python的原生列表,会更加灵活和高效。本文就来简单介绍一下NumPy多维数组的索引与切片。

本文的主要内容有:

1、NumPy多维数组的索引:获取单个元素

2、NumPy多维数组的切片:获取子数组

2、NumPy多维数组索引切片的注意事项

准备工作

NumPy中关于一维数组的索引与切片,与Python的原生列表的操作方式比较类似,比如start:stop:step的形式,-1表示最后一个元素的索引等……这里就不一一介绍了。

以下就基于一个NumPy的二维数组的索引和切片分别展开介绍。

首先,我们先创建一个用于演示索引与切片操作的二维数组:

基于上面的代码,我们获得了一个3x3的二维数组。

在进行演示之前,需要简单明确下索引和切片这两个概念:

通常说的索引,是用于获取单个元素的操作,返回的是某个元素的值。

通常所说的切片,是用于获取某个子数组,返回仍然是个数组。

NumPy多维数组的索引:获取单个元素

对于NumPy的多维数组,可以通过方括号[]来进行索引,多个索引之间使用半角逗号进行分割。

可以看到,分别进行了3x3数组中第二行第二列,也就是中心的元素进行了索引,并将其修改为100。

需要注意的是,NumPy数组是固定数据类型的,所以,如果我们尝试将一个浮点数插入到一个整型数组时,会自动截取为整型,而且不会有任何警告信息。

比如:

NumPy多维数组的切片:获取子数组

NumPy多维数组的切片(slice),也可以使用Python中的切片符号冒号来表示,与Python列表的切片类似,但也支持其他切片方式。

1、基本切片

多维数组的切片,多个维度进行也是以逗号分割,比如:

2、使用整数数组实现非连续切片

如果需要获取一个多维数组中非连续的切片,可以在每个维度传入需要切片的索引数组。

比如:

3、使用布尔数组切片

也可以使用布尔数组进行切片,本质上属于对数组元素按照条件进行过滤。

比如,想要获取a数组中所有大于5的元素:

从上面代码中,可以看到,将一个数组与一个整数进行比较时,实际上会触发广播机制,将数组中的每一个元素与该整数进行比较,返回与原数组形状相同的一个布尔数组。

使用一个同形状的布尔数组进行数组的切片,实际上类似于蒙版(mask)的操作。

NumPy多维数组索引切片的注意事项

由于NumPy在追求高效处理较大数据量的数组的设计,在对NumPy多维数组进行索引和切片时,有些不同于Python原生列表的事项需要注意。

1、自动数据截断

由于NumPy多维数组的设计是,只能存储固定类型的元素,所以,在能够进行数据类型自动转换的赋值场景中,会自动进行类型的转换,而不会有任何提示信息。比如,将浮点数赋值到整型数组中,则会自动截断为整数。

上面的索引操作中,已经演示,这里就不再展开了。

2、视图与副本

对Python原生列表进行切片时,会获取到列表的一个副本,比如:

可以看到,对列表的切片对象进行修改,原列表并没有发生变化。

但是,NumPy中,对多维数组的切片,获取的不是数据的副本,而是数据的虚拟视图。

比如:

可以看到,对NumPy数组切片的修改,原数组也发生了变化。

需要说明的是,这种切片的视图机制实际上非常有用,它意味着在处理非常大的数据集时,可以获取和处理这些数据集的片段,而不用复制底层的数据缓存。

当然,尽管数组的切片视图机制有一些非常好的特性,但是,有些时候明确地复制数组中的数据或者子数组也是非常有用的。这时,可以通过copy()方法来实现。

比如:

总结

本文简单介绍了NumPy多维数组的索引和切片的相关内容,包括:基本索引方式、基本切片方式、整型数组的切片方式、布尔数组的切片方式等。同时,对比Python原生列表的索引和切片,指出了NumPy多维数组的索引和切片需要特别注意的数据截断和切片视图机制。

以上就是本文的全部内容,感谢您的拨冗阅读,希望对您有所帮助。

0 阅读:2

南宫理的日志录

简介:深耕IT科技,探索技术与人文的交集