numpy库的使用
……
目录:
一;介绍
二;创建ndarray
三;导入库
四;创建一维数组
五;创建二维数组
六;数组类型
七;查看数组信息
八;reshape()函数调整数组大小
九;empty()函数创建空数组
十;zeros()函数创建全0数组
十一;ones()函数创建全1数组
十二;arange()函数
十三;linspace()函数
十四;random模块创建随机数组
十五;其它类型转成ndarray类型
十六;截取数组
十七;复制数组
十八;遍历数组
十九;条件运算
二十;统计运算的函数
……
一;介绍
numpy库是机器学习里面十分常用的一个库,支持各种数组、矩阵运算。
numpy的强大功能主要基于底层的一个ndarray结构,可以生成N维数组对象。
ndarray内部构成如下:
1;数组形状shape:一个表示数组各维大小的整数元祖。
2;数组数据data:一个指向内存中数据的指针。
3;数据类型dtype:一个描述数组的类型对象。
4;跨度strides:一个元祖,表示当前维度移动到下一个位置需要跨越的字节数。
5;数组顺序order:访问数组元素的主顺序,如’C’为行主序,’F’为列主序等。
……
……
二;创建ndarray
用array函数:
numpy.array(object,dtype=None,copy=True,order=None,subok=False,ndmin=0)
array函数中的参数各有不同的作用,可以定义出不同的数组。
1;object:数组或嵌套的数列
2;dtype:数组元素的数据类型,可自己定义
3;copy:对象是否需要复制,可定义
4;order:创建数组的样式,C为行方向,F为列方向,A为任意方向(默认)
5;subok:默认返回一个与基类类型一致的数组
6;ndmin:指定生成数组的最小维度
……
……
三;导入库
import numpy as np
……
……
四;创建一维数组
python一般是用列表来创建数组。
所以可以用列表来创建一个一维数组。
这就是一个一维数组了。
……
……
五;创建二维数组
二维数组同样用的最多的是列表,但需要在列表中包含列表,这样就可以实现二维数组了。
比如:
除了一维和二维,还可以创造三维数组,即列表中包含包含列表的列表,不过不是很常用。
……
……
六;数组类型
可以用dtype给数组设定不同的类型,比如:
通过上面的代码,就将dtype设置为了64位的float类型。
dtype可以设置以下的类型:
在上面的表中,类型后面的数字8,16,32,64等,其实可以理解数组中的每一个元素必须在2^8,2^16,2^32,2^64这样的一个限定范围内。
而int和uint则是有符号和无符号的区别,其实说白了,int型会出现负数,而uint只有正数,上面表中就可以看到,int的范围类型都是在负数到正数之间,而uint则是大于等于0。当然,如果在uint中输入负值也没错,它会自动帮你转成在范围之内的正值。
比如:
-1就被转成了255。而255其实等于2^8-1,正好是uint8范围内的最后一位数。
……
……
七;查看数组信息
有时需要查看数据的一个信息怎么办,可以这样:
shape会输出这是一个n*m的矩阵。(n是行,m是列)。
data会输出数据的储存位置。
size会输出数组的大小,比如上面的数组中有9个元素,则输出9。
ndim会输出数据的维度,比如上面就是一个2维数组。
type()会输出数据的类型,可以看到,这是一个numpy.ndarray类型。
……
……
八;reshape()函数调整数组大小
用reshape()函数,可以调整数组大小,让一个2*3的数组变成3*2的数组。
比如:
可以看到,输出值上面是一个2*3的数组,而下面则变成了3*2的数组。
……
……
九;empty()函数创建空数组
比如:
可以看到,用empty创建了一个2*4的空数组(注意:[2,4]这个参数和之前array()函数中不同,这里指的是创建一个2*4的空数组)。
dtype=np.int8,表示创建一个整数的空数组,而数组中的数字全部都会是在0~2^8-1范围内随机的未初始化的整数。
……
……
十;zeros()函数创建全0数组
zeros()函数其实和empty()函数差不多,区别在于zeros()创建出来的数组中的每个元素都是0。
……
……
十一;ones()函数创建全1数组
ones()函数和zeros()函数差不多,只不过数组中每个元素都是1而已。
……
……
十二;arange()函数
arange()和python的内置函数range()几乎一样。
比如这样一段代码,用arange()函数生成了0到9的一个列表。
当然,后面我还用了reshape()函数调整为了一个2*5的数组,用起来也很是方便。
……
……
十三;linspace()函数
linspace()函数和arange()函数其实差不多,区别在于linspace对于细微的取值更加方便。
我设置的参数有三个,0,6和12。这表示要在0和6之间输出12个等间隔的数组成的列表,所以这个时候就不需要像arange()函数一样考虑步长,而只要考虑你需要在这个区间范围内取多少个值就行了。
……
……
十四;random模块创建随机数组
numpy库在子模块random中提供了随机数函数。
常见的随机数函数有randint、rand。(这两个函数的作用各不相同)
比如我要创建一个随机数在1~10之间的4*4的数组,可以用randint创建,有以下代码:
可以看到,数组中的每一个元素,都是1~10之间的随机数。(可以等于1,但不等于10)
再比如rand()函数,在rand()函数参数中写上2*3,便会产生一个2*3的数组,数组中的每一位元素都是0.0~1.0之间的随机数,如下:
……
……
十五;其它类型转成ndarray类型
可以直接用array()函数进行转化,比如:
在上面中,将a用array()函数转化后,原本是list类型就变成了numpy.ndarray类型。而且从下面可以看到,这两个类型的输出格式是不一样的。
……
……
十六;截取数组
可以用类似切片的方法,从一个数组中截取部分数组。比如我从一个4*4的数组中,截取出一个2*3的数组。
这样就成功的截取出了4*4数组中的一部分,可以通过调整参数,任意进行截取其中的部分数组。
……
……
十七;复制数组
一共有三种方法可以复制数组。
一种是进行切片的方式复制,第二种是利用copy()函数复制。
如下:
a1和a2分别代表两种复制方法,都可以得到和原来一模一样的数组。
那可不可以直接用等号进行复制数组呢?
试一试:
可以看到,a和a3的输出结果是一样的,可当我想要改变a3中[0][0]这个位置的值的时候,却连a的值也一起改变了,这说明用a和a3根本就是同一个东西,只不过a3相当于是a的别名,但它们所代表的都是同一个东西。而这并不是复制,只是给数组a取了个别名而已,所以称不上是复制。
……
……
十八;遍历数组
如果是二维数组的话,可以用双重for循环进行遍历。
最外围的是对行进行循环,最里面的是对列进行循环。
比如:
这样一个双重for循环,就可以输出数组中的每一个元素的值了。用双重for循环可以很方便的对元素中的每一个值进行操作。
其实不使用双重for循环也可以,numpy里面有一个nditer()函数可以对数组进行遍历。
比如:
用nditer()函数也可以做到对数组的遍历。不过用nditer()函数输出有一个缺点,那就是把数组进行转置过后,仍然会输出同样的值,也就是顺序不变。所以还是用双重for循环更加保险一点,不容易出错。
……
……
十九;条件运算
条件运算也很有用,比如这样:
进行一个条件判断,就可以输出一个判断条件是否满足的这样一个数组,不满足的元素是False,而满足的元素是True,一眼看过去就很清晰明了。
当然,我还可以进行其它操作,比如这样:
所有>=3的元素都变成了10,所有<3的元素则变成了0。
……
……
二十;统计运算的函数
numpy中有多个关于统计运算的函数,如下:
举例子:
比如这样一个程序,输出的第一个result是5,而5是这个数组的最大值,这个没问题。
而5后面的两行输出的是什么呢?
当axis=0时,表示输出每一列中的最大值。首先是第一列,0和3输出了3,第二列10和4输出了10,而第三列2和5输出了5,所以共同组成了[3,10,5]进行输出。
而axis=1时,表示输出每一行中的最大值。
其它统计运算的函数也和max()函数类似。
……
……