通过前几篇博文我们知道,在对图像、视频、音频的操作中,一般是将要处理的内容转化为类似多维数组这种数据结构进行处理的。在对图像、视频(其实是逐帧图像的处理)、音频(使用一定维度的数组对声音进行采样处理)等处理过程中这种类似多维数组的数据结构很常用。
这种处理方式其实是简单高效的
而在多维数组处理过程中,我们知道,numpy这个C编译库无论是在速度还是性能表现上都很占优势。因此,对于这个库的掌握是我们进入Python数据处理(包括类似图像、视频、音频等的处理,其实也是数据处理)的必经之路。今天,我们来梳理一下Python使用numpy进行数组维度变换的几种常用方法。
数据处理及分析中numpy是经典
为什么是numpy
对于这个问题,我们不做过多讨论,究其原因,主要是numpy的速度比Python原生列表list要快,在处理多维数组过程中,它减少甚至避免了使用for循环的频率(提高程序性能,减少代码量);其次,我们在处理很多日常的案例中,经常将数据结构转化为numpy的array(多维数组)类型,这个类型应用场景很多(它类似我们python中的列表嵌套,而又不同于列表嵌套,它的速度是远快于for循环嵌套);最后,这个库使用C编译,其内置的数据处理算法非常优异,进一步提升了程序运行效率,感兴趣的朋友们可以了解下。
numpy使用C编译,计算效率高
数组创建及维度获取
创建一维数组
>>>import numpy as np
>>> a = np.arange(10)>>> aarray([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
这样,就生成了10个元素的一维数组。
创建3*3维度的数组
import numpy as np
a = np.array([np.arange(3)], [np.arange(3)], dtype=int32)
也可以这样
a = np.arange(9).reshape((3, 3))
获取数组其它信息
数组维度一般使用ndim属性获取,这里就不再做过多展示,想了解更多,参见另一篇博文numpy库学习总结(基础知识),其中讲解了numpy如何获取数组信息的方法。
numpy维度变换
【展平数组(多维转一维)】
使用a.flatten()和a.ravel()。两个函数都能将一个数组展平(变为一维数组)。但是,二者的区别在于,ravel()函数返回的是一个数组视图,没有在内存中创建一个新数组,而flatten()函数会在内存空间中创建一个数组对象,这是二者的区别。
【维度间转化(多维之间转化)】
一般使用如下方法
a.shape = (3, 3) # 直接通过shape属性设置
a.reshape((3, 3)) # 使用reshape()方法,传入参数为维度的元组信息
a.resize((3, 3)) # 使用resize()方法,传入维度元组信息
上面三个方法都可以实现数组的维度转化。区别在于,a.shape直接通过设置shape属性进行转化,这样会改变数组a;a.reshape()方法不会改变原数组a的维度;a.resize()直接改变原数组a。大家可根据个人兴趣选择使用哪种方式。
【数组转置】
顾名思义,就是实现维度的转置。源自一种矩阵运算。简单来讲就是将一个m*n的矩阵转换为n*m这样子的矩阵。比如,将一个5*2数组转置为2*5这样的维度,如下例子。
数组转置操作举例
总结及梳理
好了,今天的内容就到这里了,和大家一起梳理学习了一下numpy有关数组维度转化的常见方法,上面这些应该是使用numpy进行数据处理的基本功,大家一定多练习。欢迎加关注,后续会持续梳理推出有关numpy的其它精彩内容,numpy还有哪些新用法呢?感兴趣的朋友们欢迎留言讨论。
关键词: numpy