目录:
介绍
numpy是’Numerical Python’的简称,numpy提供了一个高性能的多维数组对象ndarray(N Dimension Array),以及大量的库函数和操作。
维度
1)维度的写法
2)元素的索引
ndarray数据结构
1)元数据部分
存储当是当前ndarray对象当一些描述信息。比如shape\size\dtype\ndim
2)真实数据部分
存储的是当前这个ndarray对象中的真实数据
ndarray常用属性
ndim返回数组堆数
shape返回数组形状
dtype返回数组数据类型
size返回数组元素个数
itemsize返回数组每个元素占用空间大小(单位为字节)
nbytes返回数组所有元素占用空间大小(单位为字节)
ndarray与list的区别
- list列表可以存储不同数据类型,而ndarray数据存储的所有元素类型,都必须一致
- 使用numpy创建数组的效率比原生list要高的多
- 使用ndarray创建数组的好处
1)每个元素类型一致,那么整个ndarray只需要一个元数据信息即可,而不是像list一样,每个对象都需要存储一个元数据信息
2)由于元数据只需要存储一份,所以更节省空间
3)每个元素类型一致,说明每个元素占用内存大小是一致的,存储数据可以更紧凑,效率更高
列表与数组之间的相互转换
- 列表转成数组,直接对列表应用np.array函数即可
- 数组转列表:tolist()
创建数组的不同方式
1、用np.array()函数去创建数组
-
np.array(参数)函数,参数给了什么样式的数据,就构建什么样式的ndarray数组;你给我一个一维列表,我就构建一个一维数组;你给我一个二维列表,我就构建一个二维数组;
-
在numpy中,一维数组又叫做"向量";二维数组又叫做"矩阵";
2、利用np.arrange()函数去创建数组
对比range()函数
**相同点:**用法相同。都是(start,end,step)
不同点:np.arrnge()函数的步长可以是浮点数,但是range()函数的步长不能是浮点数
3、利用指定值生成指定形状的数组
-
np.zeros((x,y)):生成一个x行y列的,元素都是0的二维数组;
-
np.ones((x,y)):生成一个x行y列的,元素都是1的二维数组;
-
np.full((x,y),value):生成一个x行y列的,元素都是value的二维数组,其中这个value值可以是整数(正整数,0,负整数)或者小数;
Ps:传入一个数字,就可以创建一维数组;传入三个数字,就可以创建三维数组
4、按照已有的ndarray数组的形状,创建形状相同但指定元素的ndarray数组
先创建一个数组,再使用np.xx_like函数
常用的函数有:
-
np.zeros_like()
-
np.ones_like()
-
np.full_like()
5、创建单位矩阵和对角矩阵
1)单位矩阵
- np.eye()或np.identity()
2)对角矩阵
- np.diag()
6、创建等差数列数组
对比arrange()函数和linspace()函数学习
-
np.arange(start,stop,step)第三个参数指的是元素步长;固定步数,和首位数
-
np.linspace(start,stop,num)第三个参数指的是元素个数;固定首位数,个数。尾数可以不固定也可以固定
-
np.linspace()中两个常用的参数:endpoint和dtype。
- endpoint=True表示是包含终止值(默认),endpoint=False表示不包含终止值;
- dtype=np.float64指定创建的数组的数据类型默认是float64,你也可以设置为dtype=np.np.int32;
7、创建等比数列数组
注意:上述代码表示在2的一次方到2的七次方之间,生成4个数,这四个数字还构成了一个等比数列。
注意:上述代码表示会默认base=10,也就是说,在10的一次方到10的五次方之间,生成3个数,这3个数还构成一个等比数列。
8、通过自定义函数构建数组
(3,3)表示三行三列。第一行,第一列,坐标表示为(0,0),同理,第一行,第三列,坐标表示为(0,2)。
Numpy中的常数
- 正无穷:Inf = inf = infty = Infinity = PINF
- 负无穷:NINF
- 正零:PZERO
- 负零:NZERO
- 非数值:nan = NaN = NAN
- 自然数e:e
- π:pi
- 伽马:euler_gamma
- None:newaxis
Numpy中的数据类型与数据类型转化dtype、astype
1、numpy中常用的数据类型
1byte=4bits 、 32bit=4 bytes、 64bit=8bytes、int32、 float64
2、使用astype()函数修改数组的数据类型:相当于创建新数组
改变数组形状reshape
1、使用numpy中的reshape()函数修改数组对象
2、使用数组对象的reshape()函数修改数组对象(这个更好用,因为直接在数组后面加reshape就行)
3、改变数组形状时,如果维度大于1,可以将"最后一个维度"设置为-1
数组维度扁平化:ravel()和flatten()函数
1、相同点
不管输入的数组是多少维,通过这两个函数,输出的都是一维数据
2、不同点
ravel()输出的是原数组的视图view;fltten()输出的是原数组的拷贝。修改视图会修改原函数,拷贝不会。
切片
1、numpy中数组切片与原生python的列表切片的不同点
-
后者返回的是原始数组的浅拷贝(修改列表中的不影响远列表元素)
-
前者返回的是原始数组的视图view(修改视图也同时修改原数组)
2、使用copy数组方法
使用数组对象copy方法,可以实现底层数据的复制,而不是返回底层数据的视图view
3、numpy中切片的使用
- 使用切片需注意的点
⚠️注:一张图体会数组切片。当step为负数时,索引必须也为负数,并且start数值要大于stop数值,不然会返回空的数组。
- 当数组是多维数组时,可以使用array[高维,低维]的方式,按维度进行索引或切片
如果中括号[]中只写了一个维度的时候,就代表最高维;
对每一个维度,都可以使用上述的切片功能;
- 如何对二维数组对所有元素全部倒序过来?
在行后加-1,则对行倒序。在列后加-1,则对列倒序
索引
1、普通索引
普通索引(不是把数组当作行、列的值),返回的是原数组的视图
2、通过整数数组作为行列值进行索引
1)通过整数数组索引,获取数组中的元素
2)提供多个一维数组索引,获取数组中的元素
⚠️注:通过数组作为行列值索引返回的是原数组的拷贝,修改不影响原数组
3、用布尔值数组进行索引
含义:我们可以提供一个布尔类型的数组(A),然后通过该数组(A)来对另外一个数组(B)进行索引(元素选取)。索引的原则为:如果为True,则选取对应位置的元素,否则不选取。
-
布尔数组取一维数组中的元素
-
布尔数组取二维数组中的元素
-
构造布尔数组的几种常用运算符
4、取出两个数组中相同的元素
对应的位置,元素进行比较
数组的广播机制
1、概念
广播broacast是numpy对不同形状shape的数组进行数值计算的方式,对数组的算术运算通常在相对应的元素上进行。
⚠️注:不同形状的数组元素之间进行数值计算,会触发广播机制;同种形状的数组元素之间,直接是对应元素之间进行数值计算。
2、数组(与标量)之间的运算
1)先分别创建一维、二维、三维的数组
2)数组与标量之间的运算结果
1)标量和一维、二维、三维数组之间的广播运算
结果表示:标量可以与任意维度数组运算,对应每个最低维度的元素元算。
2)一维与二维和三维度数组的运算
b的行列可以表示为(1,2)
c的行列可以表示为 (3,2)
**结果表示:**一维数组只要列数和二维数组的列数相同即可进行运算。和三维数组也是,只要列数相同即可运算。
3)二维数组与三维数组的运算
d的数组可以表示为 (2,2,2)#第一个2字是两个的意思,后面的2,2表示2行2列。即(2,2,2)表示两个2行2列的数组。
c的行列可以表示为 (3,2)
结果表示:由于c的行数为3,d的行数为2,即使列相等,由于行数不等,导致无法成功运算。所以二维与三维数组的运算,要满足行列数相等。
数组元素的底层存储与存储顺序说明
1、C语言风格
当我们什么都不指定,直接创建了一个数组后,数据默认的填充方式是,先填满每一行,然后再填充第二行,依次进行下去。
原因是:numpy的底层是集成了C语言的,因此numpy数组元素的底层存储也就是“C风格”的,下面我们来对这种风格进行说明。
2、F语言风格
以二维数组来说,不管是C语言风格,还是F语言风格,他们在底层的存储顺序都是一行的,只不过最终呈现的效果属于“虚拟展示”。用两张图展示一下。
-
c语言风格
-
F语言风格
PS:什么是C语言风格和F语言风格?
C指的就是C语言,numpy底层集成了C语言,因此当你不指定order参数的时候,默认就采用的是C语言风格,C语言风格,最右边的索引变化最快。
F指的就是F语言,最左边的索引变化最快。如下图展示:
3、例子
创建一个数组,分别使用不同的语言风格进行元素填充
- 指定order=“C”(numpy默认就是order=“C”)
-
指定order=“F”
说明:
知识拓展补充
1、Axis轴的值
1)什么是维度?
2)axis=0与axis=1的含义
axis指的是‘轴’,轴的取值一般是0,1,2,…其中0表示最高维,1表示次高维,2表示次次高维,依次类推
当axis=0时候,拿二维数组举例,比如在a=arange(4).reshape(2,2).sum(axis=0) 表示对axis=0的轴(最高维)发生变化,对其他不变的元素进行求和运算。
同理,axis=1时候,表示对axis=1的轴(次高维)发生变化,但其他维度不变的元素 进行求和运算。
在三维数组中,还会有axis=2(最低维),表示对最低维发生变化,其他维度不变的元素进行函数运算。
2、案例说明
输入:
x = np.arange(8).reshape(2, 2, 2)
display(x)
display(x.sum(axis=0))
display(x.sum(axis=1))
display(x.sum(axis=2))
输出:
结果分析:
通过前面的叙述,我们已经知道axis=0表示最高维,axis=1表示次高维,依次下去。因此,对于三维数组来说,axis=0指的就是最高维(三维),axis=1指的就是次高维(二维),那么axis=2指的就是最低维(一维)。
-
- 当axis=0的时候,指的就是,最高维三维变化,其他维度不变化的数据会成为一组,因此x[0][0][0]、x[1][0][0];x[0][1][0]、x[1][1][0];x[0][0][1]、x[1][0][1];x[0][1][1]、x[1][1][1]各自成为一组,你把这组内对应元素相加就是x.sum(axis=0)的答案了。 - 当axis=1的时候,就是次高维二维变化,其他维度不变化,因此x[0][0][0]、x[0][1][0];x[0][0]1]、x[0][1][1];x[1][0][0]、x[1][1][0];x[1][0][1]、x[1][1][1];各自成为一组,你把这组内对应元素相加就是x.sum(axis=1)的答案了。 - 当axis=2的时候,最低维一维变化,其他维度不变化,因次x[0][0][0]、x[0][0][1];x[0][1][0]、x[0][1][1];x[1][0][0]、x[1][0][1];x[1][1][0]、x[1][1][1];各自成为一组,你把这组内对应元素相加就是x.sum(axis=2)的答案了
2021.4.21#完结 at xjtlu.CB building.
yokin
*参考内容:https://mp.weixin.qq.com/s/WQMzPkSaRS_L1j_5knp6yQ