此文是我的第324篇原创
1 Numpy更高效
使用Python的地方,就能看到Numpy,尤其是需要数值计算的地方,Numpy的高性能更是体现的淋漓尽致。
它基于Python,提供远高于Python的高性能向量、矩阵和更高维度的数据结构。之所以性能高是由于它在密集型计算任务中,向量化操作是用C和Fortran代码实现。
2 导入Numpy
只需要一行代码就能导入:
在numpy包中,描述向量,矩阵和更高维度的数据集使用的术语是.
3 生成numpy数组
有许多方法能初始化一个新的numpy数组,例如:, 等,从文件中读入数据,从python的lists等都能生成新的向量和矩阵数组。例:
v和m的类型都是ndarray,这是numpy中最主要的数据结构之一
v和m的不同仅仅是它们的形状(shape), 我们能通过ndarray.shape属性发现它们的形状信息,shape属性很有用,尤其在深度学习模型调试中:
numpy中获取元素个数通过size:
4 为什么要用numpy?
到此,看起来非常像Python的list, 那我们为什么不用Python的list计算,干嘛非要创造一个新的数组(array)类型呢?
有多个原因:
Python的list是一个通用结构。Python的list能包括任意类型的对象,并且是动态类型, 它们不支持一些数学函数,比如矩阵的点乘,实现如此的函数对于Python的list而言,不会高效,因为它是动态类型
Numpy的array是静态类型和同质的,当array被创建时,元素的类型就确定
Numpy的array更节省内存
由于是静态类型,一些数学函数实现起来会更快,例如array间的加减乘除能够用C和Fortran实现
使用ndarray.dtype, 我们能看到一个数组内元素的类型:
如果我们尝试用str类型赋值给m,会报错:
创建数组时,能指定类型,通过为dtype赋值:
dtype更多取值:, , , , , 我们还可以显示的定义数据位数的类型,如:, , ,
5 通过函数生成数组
对于更大的数组,手动初始化数据是不现实的,比如使用python的list. 我们得用numpy提供的函数才能生成不同形式的数组。比如更通用的:
函数:起始点,终点,步长;不包括终点
函数:起始点,终点,分割份数;包括终点
函数:如下例子,各项分别为 e^1,e^2, e^3,…e^10
函数,实际工作中也很有用,在这里我列举一个
这是基本用法,完全看不出干啥。如果我有10个点,想要得出这10个点的两两间距离:
特殊点的矩阵,对角阵:
主对角线偏移1的矩阵:
零阵:
1阵:
6 随机函数
Numpy提供的使用起来更友好,如下:
获得取值(0,1)上的均匀分布,生成shape为(1,2,3)的三维数组:
满足均值为0,方差为1的高斯分布得到随机数据,生成shape为(5,)的一维数组:
7 主要属性
生成1个三维数组:
每个元素的字节数:
M的总字节数:
M的维数:
8 索引数组
索引数组的元素,可以使用方括号和下标,M是三维,下标索引的方法:
使用 表示全部此维度的所有元素都要获取:
也可方便的切片:
直接赋值:
更有用的掩码索引,对应一个bool类型的数组:
M的维数:,结果维度预期:,但是实际结果维度:
掩码索引,这一特性对于带条件的选取元素很重要。例如,使用生成一维数组x:
判断x 中哪些元素大于5 呢
结果返回的一堆:True, False:
然而有时候,我们想知道x 中哪些位置的元素大于5,此时要借助 :
9 元素级操作
NumPy中两个数组加减乘除等,默认都是对应元素的操作:
v1+2:
v1 * v1:
10 矩阵运算
线性代数中,矩阵的相乘操作在NumPy 中怎么实现,两种方法: 和 。
操作:
另一种方法包装为:
经过包装后,shape取值也会变得更符合线代中的常识:
而在没有包装前:
求矩阵的行列式,要求数组的最后两个维度相等,因此重新构造一个矩阵:
11 统计变量
求平均值:
求标准差:
求方差:
求最大值:
求最小值:
求和:
求累乘:
求累和:
求迹:
12 改变Shape
NumPy数组的shape 被修改而无需复制原有数据,这使它更为高效。
我们验证下v4 是否真的没有被复制:
所以验证得出:v4仅仅是v3的视图,未发生复制。
NumPy 提供的 函数也有改变shape 的能力,将高维数组变为向量。但是,
有时,我们需要增加维度,此时可使用,它会插入1个维度,如下在第三个维度插入,v5的shape变为: [3,3,1]
13 数组由小变大
NumPy中的函数 , , , , 和 具备变换小数组为大数组的能力。
复制元素
复制块:
竖直方向合并数组:
水平方向合并数组:
指定在哪个轴向上合作数组:
以上全部手码,利用两个周的课余时间整理出来,从十几个角度汇总NumPy平时经常使用的函数,希望对大家有用。
领取专属 10元无门槛券
私享最新 技术干货