前言
作为数据分析三巨头Pandas、matplotlib、NumPy之一,必然要给足面子单独拿出来讲解一波。NumPy应用场景十分宽泛,Pandas很多函数转换后也都是NumPy数组类型的数据结构。在机器学习、深度学习以及一些数据处理操作中使用的频率甚至比Pandas都高。而且NumPy功能强大,使用起来也十分便捷,支持多种复杂操作。平时我的Pandas以及一些机器学习的文章都有用到NumPy,但是博客内容并没有详细解答NumPy的操作也没有记录有关NumPy操作的一些具体函数解答。对于我这种追求一站式服务需求的博主来说着实有点不妥,故把旧坑补上,出一期全新的一文速学系列-Numpy数据分析基础专栏。
此系列文章将被纳入我的专栏一文速学系列-NumPy数据分析基础,基本覆盖到使用NumPy数据分析日常业务以及常规的数学建模分析以及复杂操作方方面面的问题。从基础的数组操作逐步入门到处理矩阵矢量特征等复杂操作,以及专业的NumPy常用函数讲解,我都将花费了大量时间和心思创作,如果大家有需要从事数据分析或者数据开发、数学建模、Python工程的朋友推荐订阅专栏,将在第一时间学习到最实用常用的知识。此篇博客篇幅较长,值得细读实践一番,我会将精华部分挑出细讲实践。博主会长期维护博文,有错误或者疑惑可以在评论区指出,感谢大家的支持。
本篇文章将主要讲述ndarray数组的形态操作以及相关函数的使用。
一、更改数组的形状
数组的形状由沿每个轴的元素数给出:
rg = np.random.default_rng(1) a = np.floor(10 * rg.random((3, 4))) a
可以使用各种命令更改阵列的形状。以下三个命令都会返回修改后的数组,但不会更改原始数组:
1.变为一维数组
a.ravel()
2.重塑数组
a.reshape(6, 2)
3.数组转置
a.T
ravel产生的数组中元素的顺序通常是“C样式”,即最右边的索引“变化最快”,因此[0,0]后面的元素是[0,1]。如果阵列被重塑为其他形状,则该阵列再次被视为“C样式”。NumPy通常创建按此顺序存储的数组,因此ravel通常不需要复制其参数,但如果数组是通过获取另一个数组的切片或使用异常选项创建的,则可能需要复制它。还可以使用一个可选参数,指示函数ravel和reconforme使用FORTRAN样式的数组,其中最左边的索引变化最快。
整形函数使用修改后的形状返回参数,而ndarray函数返回参数。resize方法修改数组本身:
a.resize((2, 6)) a
如果在整形操作中某个尺寸给定为-1,则会自动计算其他尺寸:
a.reshape(3, -1)
二、数组堆叠
几个数组可以沿着不同的轴堆叠在一起:
a = np.floor(10 * rg.random((2, 2))) a b = np.floor(10 * rg.random((2, 2))) b np.vstack((a, b)) np.hstack((a, b))
函数column_stack将1D数组作为列堆叠到2D数组中。它仅相当于二维阵列的hstack:
from numpy import newaxis np.column_stack((a, b)) a = np.array([4., 2.]) b = np.array([3., 8.]) np.column_stack((a, b))
但是对于一维矩阵是不一样的
np.hstack((a, b))
newaxis是numpy中的一个函数,顾名思义,就是插入新维度的意思,比如将一维数组变成二维数组,二维变成三维等。
a[:, newaxis]
np.column_stack((a[:, newaxis], b[:, newaxis])) np.hstack((a[:, newaxis], b[:, newaxis]))
另一方面,对于任何输入数组,函数row_stack都等效于vstack。实际上,row_stack是vstack的别名:
通常,对于二维以上的数组,hstack沿第二轴堆栈,vstack沿第一轴堆栈,concatenate允许一个可选参数,给出应沿其进行连接的轴的数量。
在复杂的情况下,r_和c_对于通过沿一个轴叠加数字来创建阵列很有用。它们允许使用范围文字:
np.r_[1:4, 0, 4]
当与数组一起用作参数时,r_和c_在默认行为上类似于vstack和hstack,但允许使用一个可选参数给出要连接的轴的数量。
三、拆分矩阵
使用hsplit,可以沿着数组的水平轴拆分数组,方法是指定要返回的等形状数组的数目,或者指定应该在其之后进行拆分的列:
a = np.floor(10 * rg.random((2, 12))) a np.hsplit(a, 3) np.hsplit(a, (3, 4))
vsplit沿垂直轴拆分,arraysplit允许指定要沿哪个轴拆分。