一、简介
NumPy是Python的一种开源的数值计算扩展。这种工具可用来存储和处理大型矩阵,比Python自身的嵌套列表结构要高效的多(该结构也可以用来表示矩阵),支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。(摘自百度百科)
二、导入numpy包
使用前需要导入numpy包,方法如下:
import numpy
import numpy as np #将np设为numpy的缩写
from numpy import *
三、数组(array)
有序排列的同类数据元素的集合称为数组
有序:可进行索引操作
同类:数组中的元素数据类型相同(这也是数组与列表的不同点)
四、数组的索引
1、一维数组
(1)索引第n个元素
例如取数组中的第三个元素
import numpy as np
a=np.array([0,1,2,3,4,5]) #定义一个一维数组
print(a[2])
(2)修改第n个元素
例如将第三个元素修改为10
import numpy as np
a=np.array([0,1,2,3,4,5])
a[2]=10
print(a)
结果输出为[0,1,10,3,4,5]
(3)一维数组的花式索引
a.输入指定位置的花式索引
语法:
l=[索引1,索引2,…,索引n]
print(a[l])
例如取数组b的第1,3,5位元素
import numpy as np
b=np.array([0,10,20,30,40,50,60,70,80,90])
l=[0,2,4]
print(a[l])
输出结果为[0,20,40]
b.布尔型花式索引
例如取数组a中的第1,2,4位元素
import numpy as np
a=np.array([0,1,2,3,4,5])
l=np.array([1,1,0,1,0,0],dtype=bool) #将数组类型转换为布尔型
print(a[l])
输出结果为[0,1,3]
2、多维数组
(1)索引第x行第y列的元素
例如取第1行第2列的元素
import numpy as np
a=np.array([[0,1,2,3],[4,5,6,7]]) #定义一个二维数组,多维数组每一行的元素个数要相等
print(a[0,1])
注意:行与列的索引都从0开始
(2)取第n行
例如取数组a的第二行
print(a[1])
(3)多维数组的花式索引
a.输入指定位置的花式索引
语法:a[(行1,行2,…,行n),(列1,列2,…,列n)]
例如取数组a中第2行第3列和第4行第4列的元素
import numpy as np
a=np.array([[0,1,2,3],
[4,5,6,7],
[8,9,10,11],
[12,13,14,15]])
print(a[(1,3),(2,3)])
结果为[6,15]
b.布尔型花式索引
例如取数组a第3列第1和第4位元素
import numpy as np
a=np.array([[0,1,2,3],
[4,5,6,7],
[8,9,10,11],
[12,13,14,15]])
mask=np.array([1,0,0,1],dtype=bool)
a[mask,2]
输出结果为[2,14]
五、数组的切片
数组的切片既支持正索引也支持负索引
1.一维数组
a[起点:终点(不包含):步长]
2.多维数组
a[行起点;行终点(不包含):步长,列起点;列终点(不包含):步长]
例如:
import numpy as np
a=np.array([[0,1,2,3],
[4,5,6,7],
[8,9,10,11],
[12,13,14,15]])
print(a[1::,:2:])
结果为[[ 4 5] [ 8 9] [12 13]]
注意:花式索引与切片不同 切片在内存中采用引用机制,改变切片也会改变原数组 而花式索引返回的是原对象的一个复制而不是引用。
六、数组的常用操作
1.类型转换
语法:(1) a=np.array([1,2,3,4],dtype=数据类型)
(2) a=a.astype(数据类型)
2.生成全0数组
语法:np.zeros(个数)
import numpy as np
c=np.zeros(4)
print(c)
由于数组默认数据类型为float,所以结果为:
[0. 0. 0. 0.]
若要整数形式可将第二行改为:
c=np.zeros(4,dtype=int)
生成全1数组将zeros改为ones即可
3.fill方法
语法:a.fill(指定值)
例如将数组c中的元素全改为5
import numpy as np
c=np.zeros(4,dtype=int)
c.fill(5)
print(c)
结果为[5,5,5,5]
注意:如若传入参数与数组类型不同,需要转换为同一类型
4.生成等差数列
语法:(1)a=np.arange(起点,终点(不包含),步长)
(2)a=np.linspace(起点,终点(包含),个数)
5.生成随机数
语法:a=np.random.rand(个数)
6.查看类型
以下面的代码为例:
import numpy as np
a=np.array([[0,1,2,3],
[4,5,6,7],
[8,9,10,11],
[12,13,14,15]])
print(type(a))
print(a.dtype)
输出结果为:
<class ‘numpy.ndarray’>
int32
由此可知type()查看的是变量的数据类型,dtype查看的是数组中元素的数据类型~~(我也不知道该怎么说,但大概就是那么个意思)~~
7.查看形状
(1)一维数组
import numpy as np
b=np.array([0,10,20,30,40,50,60,70,80,90])
print(b.shape) #写成shape(b)也可以
输出结果:(10,)
表示一行有10个元素
(2)多维数组
import numpy as np
a=np.array([[0,1,2],
[4,5,6],
[8,9,10],
[12,13,14]])
print(a.shape)
输出结果:(4, 3)
表示有4行3列
8.查看数组里元素的数目
使用方法如下:
import numpy as np
b=np.array([0,10,20,30,40,50,60,70,80,90])
print(b.size)
9.查看数组维度
import numpy as np
b=np.array([0,10,20,30,40,50,60,70,80,90])
print(b.ndim)
10.排序
(1)sort函数
import numpy as np
a=np.array([6,8,4,2,9])
b=np.sort(a)
print(b)
print(a)
输出结果:
[2, 4 ,6 ,8 ,9]
[6, 8, 4 ,2, 9]
注意:原数组不变
(2)argsort函数
返回从小到大的排列在数组中的索引位置
a=np.array([6,8,4,2,9])
b=np.argsort(a)
print(b)
print(a[b])
输出结果为:
[3 ,2 ,0 ,1, 4] #这是索引
[2 ,4 ,6 ,8 ,9]
除了以上这些还有:
功能 | 语法 |
---|---|
求和 | np.sum(a)/a.sum() |
求最大值 | np.max(a)/a.max() |
求最小值 | np.min(a)/a.min() |
求均值 | np.mean(a)/a.mean() |
求标准差 | np.std(a)/a.std() |
相关系数矩阵 | np.cov(a,b) |
取绝对值 | np.abs(a) |
求指数 | np.exp(a) |
求中值 | np.median(a) |
求累计和 | np.cumsum(a) |
除了这些还有很多。。。。
七、多维数组的常用操作
1.数组形状
(1)shape
语法:a.shape=行,列
import numpy as np
b=np.array([0,10,20,30,40,50,60,70,80,90])
b.shape=2,5
print(b)
输出结果为:
[[ 0, 10 ,20 ,30 ,40]
[50 ,60, 70 ,80, 90]]
(2)reshape
语法:a2=a1.reshape(行,列)
import numpy as np
b=np.array([0,10,20,30,40,50,60,70,80,90])
c=b.reshape(2,5)
print(c)
print(b)
输出结果为:
[[ 0 10 20 30 40]
[50 60 70 80 90]]
[ 0 10 20 30 40 50 60 70 80 90]
由此可见,reshape并没有改变原数组
2.转置
即行列互换,如2行3列变3行2列
import numpy as np
a=np.array([[0,1,2],
[4,5,6],
[8,9,10],
[12,13,14]])
print(a.T) #写成a.transpose()也可以
输出结果为:
[[ 0 4 8 12]
[ 1 5 9 13]
[ 2 6 10 14]]
3.数组拼接
(1)concatenate
语法:np.concatenate((数组1,数组2,…,数组n),axis=0)
axis=0:纵向拼接
axis=1:横向拼接
默认axis=0
import numpy as np
a=np.array([[0,1,2,3,4],[5,6,7,8,9]])
b=np.array([[10,11,12,13,14],[15,16,17,18,19]])
c=np.concatenate((a,b),axis=0)
d=np.concatenate((a,b),axis=1)
print(c)
print(d)
输出结果为:
[[ 0 1 2 3 4]
[ 5 6 7 8 9]
[10 11 12 13 14]
[15 16 17 18 19]]
[[ 0 1 2 3 4 10 11 12 13 14]
[ 5 6 7 8 9 15 16 17 18 19]]
(2)将二维数组连接成三维数组
语法:数组=np.array((数组1),数组2,…,数组n))
import numpy as np
a=np.array([[0,1,2,3,4],[5,6,7,8,9]])
b=np.array([[10,11,12,13,14],[15,16,17,18,19]])
e=np.array((a,b))
print(e)
输出结果为:
[[[ 0 1 2 3 4]
[ 5 6 7 8 9]]
[[10 11 12 13 14]
[15 16 17 18 19]]]
(3)vstack,hstack,dstack
纵向堆叠:np.vstack((数组1,数组2,…,数组n))
横向拼接:np.hstack((数组1,数组2,…,数组n))
连接成三维数组:np.dstack((数组1,数组2,…,数组n))