点击上方“机器学习与生成对抗网络”,关注"星标"算法
获取有趣、好玩的前沿干货!数组
文仅交流,侵删微信
numpy能够说是Python运用于人工智能和科学计算的一个重要基础,近段时间刚好学习了numpy,pandas,sklearn等一些Python机器学习和科学计算库,所以在此总结一下经常使用的用法。
网络
引入numpy库的方式:import numpy as np
一、numpy数组(array)的建立
经过array方式建立,向array中传入一个list实现
一维数组的建立:

二维数组的建立:传入一个嵌套的list便可,以下例

经过arange建立数组:下例中建立一个0~1间隔为0.1的行向量,从0开始,不包括1,第二个例子经过对齐广播方式生成一个多维的数组。


经过linspace函数建立数组:下例中建立一个0~1间隔为1/9的行向量(按等差数列形式生成),从0开始,包括1.

经过logspace函数建立数组:下例中建立一个1~100,有20个元素的行向量(按等比数列形式生成),其中0表示10^0=1,2表示10^2=100,从1开始,包括100

生成特殊形式数组:
生成全0数组(zeros()函数),生成全1数组(ones()函数), 仅分配内存但不初始化的数组(empty()函数)。注意要指定数组的规模(用一个元组指定),同时要指定元素的类型,不然会报错

生成随机数组
经过frombuffer,fromstring,fromfile和fromfunction等函数从字节序列、文件等建立数组,下例中生成一个9*9乘法表

二、显示、建立、改变的数组元素的属性、数组的尺寸(shape)等


三、改变数组的尺寸(shape)
reshape方法,第一个例子是将43矩阵转为34矩阵,第二个例子是将行向量转为列向量。注意在numpy中,当某个轴的指定为-1时,此时numpy会根据实际的数组元素个数自动替换-1为具体的大小,如第二例,咱们指明了c仅有一列,而b数组有12个元素,所以c被自动指定为12行1列的矩阵,即一个12维的列向量。


四、元素索引和修改
简单的索引形式和切片:


当使用布尔数组b做为下标存取数组x中的元素时,将收集数组x中全部在数组b中对应下标为True的元素。使用布尔数组做为下标得到的数组不和原始数组共享数据空间,注意这种方式只对应于布尔数组(array),不能使用布尔列表(list)。(附注:当布尔数组的长度与被索引的数组的长度短时,不足的部分都看成False)

利用条件进行索引:利用不等式等进行索引

多维数组的索引和切片(右边框图中的颜色和左边的指令的颜色相对应):

一样的,能够采用bool型的方式对数组进行索引和切片操做

其实多维数组的索引仍是很好理解的,例以下例中,咱们能够看到对于一个张量,也就是b,对其索引是,[i,j,k]中的i表示选择第几个二维数组,而后j表示取二维数组中的第几个行向量,k表示取行向量中的第几个元素。
五、ufunc操做
ufunc是universal function的缩写,它是一种能对数组的每一个元素进行操做的函数。numPy内置的许多ufunc函数都是在C语言级别实现的,所以它们的计算速度很是快。下面给一个计算sin函数(sin函数计算数组中所有元素的sin值)的小实例:

四则运算符能够直接用于数组(一维或多维)计算:app


比较操做也可直接进行,以下,比较x1和x2各对应元素的大小,返回的是一个bool型数组。同理,可用的操做符有 ‘==’,‘!=’,‘<’,‘>’,‘<=’,‘>=’等。另外可使用数组的any()或all()方法。只要数组中有一个值为True,则any()返回True;而只有数组的所有元素都为True,all()才返回True。机器学习


想要了解更多的numpy自带的ufunc函数,能够查看这篇博客:函数
numpy教程:数学函数和基本统计函数学习
https://blog.csdn.net/pipisorry/article/details/41214819人工智能
自定义ufunc函数:frompyfunc(func,nin,nout) 函数能够将计算单个值的函数转换成一个可对数组中每一个元素进行计算的ufunc函数。其中nin是输入func的参数的个数,nout是func返回值的个数。以下例。spa

reduce方法(与Python的reduce函数相似,其沿着axis轴对array进行操做)


accumulate方法(其做用和reduce方法相似,可是会保存中间结果)

outer方法(对其两个参数数组的每两对元素的组合进行运算,计算外积):若数组a的维数为M,数组b的维数为N,则ufunc函数op的outer()方法对a、b数组计算所生成的数组c的维数为M+N,c的形状是a、b的形状的结合。例如a的形状为(2,3),b的形状为(4,5),则c的形状为(2,3,4,5)。

六、广播操做
广播是针对形状不一样的数组的运算采起的操做。
当咱们使用ufunc函数对两个数组进行计算时,ufunc函数会对这两个数组的对应元素进行计算,所以它要求这两个数组有相同的大小(shape相同)。若是两个数组的shape不一样的话(行列规模不等),会进行以下的广播(broadcasting)处理:
1). 让全部输入数组都向其中shape最长的数组看齐,shape中不足的部分都经过在前面加1补齐。所以输出数组的shape是输入数组shape的各个轴上的最大值(往最大轴长上靠)。
2). 若是输入数组的某个轴和输出数组的对应轴的长度相同或者其长度为1时,这个数组可以用来计算,不然出错。
3). 当输入数组的某个轴的长度为1时,沿着此轴运算时都用此轴上的第一组值。
感受说的不太明白,因而仍是用实例说话好了。

七、矩阵运算
矩阵乘法(dot乘法,注意要符合矩阵乘法规则)

内积(inner,计算向量/矩阵内积):和dot乘积同样,对于两个一维数组,计算的是这两个数组对应下标元素的乘积和;对于多维数组a和b,它计算的结果数组中的每一个元素都是数组a和b的最后一维的内积,所以数组a和b的最后一维的长度必须相
计算公式为:
inner(a, b)[i,j,k,m] = sum(a[i,j,:]*b[k,m,:])


外积(outer,计算外积):只按照一维数组进行计算,若是传入参数是多维数组,则先将此数组展平为一维数组以后再进行运算。outer乘积计算的列向量和行向量的矩阵乘积

解线性方程组(solve):solve(a,b)有两个参数a和b。a是一个N*N的二维数组,而b是一个长度为N的一维数组,solve函数找到一个长度为N的一维数组x,使得a和x的矩阵乘积正好等于b,数组x就是多元一次方程组的解。

八、文件存取(假设有数组array为a,假定类型为int32)
a.tofile(file_name) ,保存a到file_name文件中,file_name为字符串类型,如‘a.txt’等;从文件中读回a数组时须要指明类型,如b=np.fromfile(file_name,dtype=np.float)时会报错,正确的使用方式是b=np.fromfile(file_name,dtype=np.int32)
save和load方法(写入文件和从文件读回都不须要指明类型,存储文件类型为npy格式文件):
np.save(“a.npy”, a) # 将array a存入a.npy文件中
c = np.load( “a.npy” ) # 从a.npy文件中读回array a
savetxt和loadtxt方法(保存为txt格式文件):
np.savetxt(“a.txt”, a) # 将array a存入a.txt文件中
np.loadtxt(“a.txt”) # 从a.txt文件中读回array a
猜您喜欢:
附下载 |《TensorFlow 2.0 深度学习算法实战》
本文分享自微信公众号 - 机器学习与生成对抗网络(AI_bryant8)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。