扩展库Numpy简介
参考资料:《Python可以这样学》(董付国)
本文原来是写在jupyter notebook上的,转成了.md格式再复制到这里来的,如果你觉得这样看起来不方便,需要.ipynb格式,请私信我:)
文章预览:
import numpy as np #导入numpy模块
1.生成数组
np.array((1,2,3,4,5)) #把Python列表转换成数组
array([1, 2, 3, 4, 5])
np.array(range(5)) #把range对象转换成数组
array([0, 1, 2, 3, 4])
np.array([[1,2,3],[4,5,6]])
array([[1, 2, 3],
[4, 5, 6]])
np.linspace(0,10,11) #生成等差数组 表示从0到10生成11个数
array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9., 10.])
np.linspace(0,1,11) #表示0到1生成11个数
array([0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1. ])
np.logspace(0,100,10) #对数数组 从0到100等差取十个数,做幂运算。令公差为d,返回的十个为10的0次方、d次方、2d次方
array([1.00000000e+000, 1.29154967e+011, 1.66810054e+022, 2.15443469e+033,
2.78255940e+044, 3.59381366e+055, 4.64158883e+066, 5.99484250e+077,
7.74263683e+088, 1.00000000e+100])
np.zeros((3,3)) #全0二维数组
array([[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.]])
np.zeros((3,1))
array([[0.],
[0.],
[0.]])
np.zeros((1,3))
array([[0., 0., 0.]])
np.ones((3,3)) #全1二维数组
array([[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]])
np.identity(4) #单位矩阵
array([[1., 0., 0., 0.],
[0., 1., 0., 0.],
[0., 0., 1., 0.],
[0., 0., 0., 1.]])
np.empty((3,3)) #空数组,只申请空间而不初始化,元素值是不确定的
array([[1., 0., 0.],
[0., 1., 0.],
[0., 0., 1.]])
2.数组与数值的算术运算
x=np.array((1,2,3,4,5)) #创建数组对象
x
array([1, 2, 3, 4, 5])
x*2
array([ 2, 4, 6, 8, 10])
x/2
array([0.5, 1. , 1.5, 2. , 2.5])
x//2
array([0, 1, 1, 2, 2], dtype=int32)
x **3
array([ 1, 8, 27, 64, 125], dtype=int32)
x+2 #数组与数值相加
array([3, 4, 5, 6, 7])
x%3 #余数
array([1, 2, 0, 1, 2], dtype=int32)
3.数组与数组的算术运算
a = np.array((1,2,3))
b = np.array(([1,2,3],[4,5,6],[7,8,9]))
c = a*b #数组相乘,a中的每个元素乘以b中的每一列元素
c
array([[ 1, 4, 9],
[ 4, 10, 18],
[ 7, 16, 27]])
c/b
array([[1., 2., 3.],
[1., 2., 3.],
[1., 2., 3.]])
c/a
array([[1., 2., 3.],
[4., 5., 6.],
[7., 8., 9.]])
a+a
array([2, 4, 6])
a*a
array([1, 4, 9])
a-a
array([0, 0, 0])
a/a
array([1., 1., 1.])
4.二维数组转置
b = np.array(([1,2,3],[4,5,6],[7,8,9]))
b
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
b.T
array([[1, 4, 7],
[2, 5, 8],
[3, 6, 9]])
a=np.array((1,2,3,4))
a
array([1, 2, 3, 4])
a.T #一维数组转置以后和原来是一样的
array([1, 2, 3, 4])
5.向量内积
a=np.array((5,6,7))
b=np.array((6,6,6))
a.dot(b) #向量内积
(108, 108)
np.dot(a,b) #向量内积
108
c = np.array(([1,2,3],[4,5,6],[7,8,9]))
cT=c.T
c.dot(a)
array([ 38, 92, 146])
c[0].dot(a)
38
c[1].dot(a)
92
a.dot(cT[2])
114
6.数组元素访问
b=np.array(([1,2,3],[4,5,6],[7,8,9]))
b
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
b[0]
array([1, 2, 3])
b[0][0]
1
多元素同时访问
x=np.arange(0,100,10)
x
array([ 0, 10, 20, 30, 40, 50, 60, 70, 80, 90])
index = np.random.randint(1,len(x),5)
index
array([6, 6, 2, 3, 7])
x[index]
array([60, 60, 20, 30, 70])
x[index] = [1,2,3,4,5] #同时修改多个元素的值
x
array([ 0, 10, 3, 4, 40, 50, 2, 5, 80, 90])
x[[1,2,3]] #同时访问多个元素的值
array([10, 3, 4])
7.对数组进行函数运算
x=np.arange(0,100,10)
np.sin(x) #一维数组中所有元素求正弦值
array([ 0. , -0.54402111, 0.91294525, -0.98803162, 0.74511316,
-0.26237485, -0.30481062, 0.77389068, -0.99388865, 0.89399666])
b=np.array(([1,2,3],[4,5,6],[7,8,9]))
np.cos(b)
array([[ 0.54030231, -0.41614684, -0.9899925 ],
[-0.65364362, 0.28366219, 0.96017029],
[ 0.75390225, -0.14550003, -0.91113026]])
np.round(np.cos(b)) #四舍五入
array([[ 1., -0., -1.],
[-1., 0., 1.],
[ 1., -0., -1.]])
x=np.random.rand(10)
x*=10
x
array([0.72528784, 7.46094155, 0.94747503, 2.10896222, 9.50620225,
2.64778271, 0.68896693, 1.19711742, 7.17753355, 0.93906123])
np.floor(x) #向下取整
array([0., 7., 0., 2., 9., 2., 0., 1., 7., 0.])
np.ceil(x) #向上取整
array([ 1., 8., 1., 3., 10., 3., 1., 2., 8., 1.])
8. 对矩阵不同维度上的元素进行计算
x=np.arange(0,10).reshape(2,5) #创建二维数组
x
array([[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9]])
np.sum(x) #求和
45
np.sum(x,axis = 0)# 纵向求和
array([ 5, 7, 9, 11, 13])
np.sum(x,axis = 1) #横向求和
array([10, 35])
np.mean(x,axis = 0) #纵向求算术平均值
array([2.5, 3.5, 4.5, 5.5, 6.5])
np.mean(x,axis = 1) #横向求算术平均值
array([2., 7.])
weight = [0.3,0.7] #权重
np.average(x,axis = 0,weights = weight) # 二维数组纵向计算加权平均值
array([3.5, 4.5, 5.5, 6.5, 7.5])
np.max(x)
9
np.max(x,axis = 0) #纵向求最大值,即每列的最大值
array([5, 6, 7, 8, 9])
x=np.random.randint(1,10,size=(3,3))
x
array([[8, 1, 6],
[1, 4, 1],
[8, 7, 9]])
np.std(x) #求所有元素的标准差
3.1269438398822866
np.std(x,axis=1) #横向求标准差 即每行元素的标准差
array([2.94392029, 1.41421356, 0.81649658])
np.var(x,axis = 0) #纵向求方差 即每列元素的方差
array([10.88888889, 6. , 10.88888889])
np.sort(x,axis = 0) #纵向排列 从小到大
array([[1, 1, 1],
[8, 4, 6],
[8, 7, 9]])
9. 改变数组大小
a=np.arange(1,11,1)
a
array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
a.shape = 2,5 #改为两行五列
a
array([[ 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10]])
a.shape=5,-1 # -1表示自动计算
a
array([[ 1, 2],
[ 3, 4],
[ 5, 6],
[ 7, 8],
[ 9, 10]])
b=a.reshape(2,5) #reshape()方式返回新数组
b
array([[ 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10]])
10.切片操作
a=np.arange(10)
a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
a[::-1] #反向切片
array([9, 8, 7, 6, 5, 4, 3, 2, 1, 0])
a[::2] #隔一个取一个元素
array([0, 2, 4, 6, 8])
a[:5] #前五个元素
array([0, 1, 2, 3, 4])
c=np.arange(25)
c.shape=5,5
c
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19],
[20, 21, 22, 23, 24]])
c[0,2:5] #第0行中下标[2,5)之间的元素
array([2, 3, 4])
c[1] #第0行中所有元素
array([5, 6, 7, 8, 9])
c[2:5,2:5] #行下标和列下标都结语[2,5)之间的元素值
array([[12, 13, 14],
[17, 18, 19],
[22, 23, 24]])
11.布尔运算
x=np.random.rand(10) #10个数的随机数组
x
array([0.66334709, 0.82328621, 0.41857429, 0.28620644, 0.26740633,
0.95842834, 0.94531951, 0.6467254 , 0.41522248, 0.64909167])
x>0.5 #比较数组中每个元素值是否大于0.5
array([ True, True, False, False, False, True, True, True, False,
True])
x[x>0.5] #获取数组中大于0.5的元素
array([0.66334709, 0.82328621, 0.95842834, 0.94531951, 0.6467254 ,
0.64909167])
a=np.array([1,2,3])
b=np.array([3,2,1])
a>b #对应位置上元素比较大小
array([False, False, True])
a[a>b]
array([3])
a ==b
array([False, True, False])
a[a==b]
array([2])
12.广播
a = np.arange(0,60,10).reshape(-1,1) #列向量, -1表示自动计算
a
array([[ 0],
[10],
[20],
[30],
[40],
[50]])
b=np.arange(0,6)
b
array([0, 1, 2, 3, 4, 5])
a+b #广播
array([[ 0, 1, 2, 3, 4, 5],
[10, 11, 12, 13, 14, 15],
[20, 21, 22, 23, 24, 25],
[30, 31, 32, 33, 34, 35],
[40, 41, 42, 43, 44, 45],
[50, 51, 52, 53, 54, 55]])
a*b
array([[ 0, 0, 0, 0, 0, 0],
[ 0, 10, 20, 30, 40, 50],
[ 0, 20, 40, 60, 80, 100],
[ 0, 30, 60, 90, 120, 150],
[ 0, 40, 80, 120, 160, 200],
[ 0, 50, 100, 150, 200, 250]])
13.分段函数
x=np.arange(10)
x
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
np.where(x<5,0,1) # 小于5的元素值对应0,其他对应1
array([0, 0, 0, 0, 0, 1, 1, 1, 1, 1])
np.piecewise(x,[x<4,x>7],[lambda x:x*2,lambda x:x*3]) #满足小于4大于7的数字乘以3,其他乘以2
array([ 0, 2, 4, 6, 0, 0, 0, 0, 24, 27])
14.计算唯一值以及出现次数
x= np.random.randint(0,10,7)
x
array([3, 5, 7, 6, 4, 2, 7])
a=np.bincount(x)#元素出现的次数, 这个不太好讲 忘了的话查一下bincount()
a
array([0, 0, 1, 1, 1, 1, 1, 2], dtype=int64)
np.sum(a) # 所有元素出现次数之和等于数组长度
7
len(x)
7
np.unique(x) #返回唯一元素值
array([2, 3, 4, 5, 6, 7])
x=np.random.randint(0,10,10)
x
array([5, 3, 7, 5, 7, 6, 1, 4, 8, 8])
y = np.random.rand(10) #随机小数,模拟权重
y = np.round_(y,1) #保留一位小数
y
array([0.2, 0.3, 0.7, 0.9, 0.3, 0.2, 0.4, 0.2, 0. , 0.2])
np.sum(x*y)/np.sum(np.bincount(x)) #加权总和/出现总次数或元素个数
1.7399999999999998
15.矩阵运算
a_list=[3,5,7]
a_mat=np.matrix(a_list)
a_mat
matrix([[3, 5, 7]])
a_mat.T
matrix([[3],
[5],
[7]])
a_mat.shape #矩阵形状
(1, 3)
a_mat.size
3
b_mat=np.matrix((1,2,3))
b_mat
matrix([[1, 2, 3]])
a_mat * b_mat.T # 矩阵相乘
matrix([[34]])
a_mat.mean() #元素平均值
5.0
a_mat.sum() #求和
15
a_mat.max()
7
c_mat=np.matrix([[1,5,3],[2,9,6]]) #创建二维矩阵
c_mat
matrix([[1, 5, 3],
[2, 9, 6]])
c_mat.argsort(axis =0) #纵向排序后的元素序号
matrix([[0, 0, 0],
[1, 1, 1]], dtype=int64)
c_mat.argsort(axis = 1) #横向排序后的元素序号
matrix([[0, 2, 1],
[0, 2, 1]], dtype=int64)
d_mat=np.matrix([[1,2,3],[4,5,6],[7,8,9]])
d_mat
matrix([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
d_mat.diagonal() #对角线元素
matrix([[1, 5, 9]])
d_mat.flatten() #矩阵平铺
matrix([[1, 2, 3, 4, 5, 6, 7, 8, 9]])
`