【python】- 常用库之Numpy(2)
import numpy as np
1 创建数组
#一维数组的创建
a=np.array([2,3,4],dtype=np.int32)
print(a)
print(a.dtype)
[2 3 4]
int32
#多维数组的创建
a=np.array([[1,2,3],[2,3,4]])
print(a)
[[1 2 3]
[2 3 4]]
#创建全零数组
a=np.zeros((2,4))
print(a)
[[0. 0. 0. 0.]
[0. 0. 0. 0.]]
#创建全一数组,同时指定数据类型
a=np.ones((3,4),dtype=np.int)
print(a)
[[1 1 1 1]
[1 1 1 1]
[1 1 1 1]]
#创建全空数组,每个数接近于0
a=np.empty((3,4))
print(a)
[[1.186e-321 0.000e+000 0.000e+000 0.000e+000]
[0.000e+000 0.000e+000 0.000e+000 0.000e+000]
[0.000e+000 0.000e+000 0.000e+000 0.000e+000]]
#创建连续数组
a=np.arange(1,10,2) #1-10的数据,步长为2
print(a)
[1 3 5 7 9]
#reshape操作---改变数组的形状
a=np.arange(0,12,2)
print(a)
b=a.reshape((2,3))
print(b)
[ 0 2 4 6 8 10]
[[ 0 2 4]
[ 6 8 10]]
#创建连续型数据
a=np.linspace(1,10,5) #首1,尾10,分成5个数据
print(a)
[ 1. 3.25 5.5 7.75 10. ]
2 基本操作和运算
# 一维矩阵运算
a=np.array([1,2,3,4])
b=np.arange(4)
print(a,b)
c1=a-b #对应相减
print(c1)
c2=a*b #对应相乘
print(c2)
c3=a.dot(b)
print(c3) #对应相乘再求和
c4=b**2
print(c4) #相应位置平方
c5=np.sin(a) #数学函数工具求sin
print(c5)
print(a<2)
[1 2 3 4] [0 1 2 3]
[1 1 1 1]
[ 0 2 6 12]
20
[0 1 4 9]
[ 0.84147098 0.90929743 0.14112001 -0.7568025 ]
[ True False False False]
#多维矩阵运算
a=np.array([[1,1],[0,1]])
b=np.arange(4).reshape((2,2))
print(a)
print(b)
c1=a.dot(b) #矩阵乘a*b
print(c1)
a=np.random.random((2,4))
print(a)
print(np.sum(a))
print(np.min(a))
print(np.mean(a))
[[1 1]
[0 1]]
[[0 1]
[2 3]]
[[2 4]
[2 3]]
[[0.06649722 0.05433084 0.02834851 0.65647141]
[0.6025922 0.77713191 0.56970899 0.65963372]]
3.414714800668307
0.02834851107015879
0.42683935008353835
c2=np.sum(a,axis=0) #按列进行求和
print(c2)
c3=np.sum(a,axis=1) #按行进行求和
print(c3)
[0.66908942 0.83146275 0.5980575 1.31610513]
[0.80564798 2.60906682]
#矩阵基本计算
A=np.arange(2,14).reshape((3,4))
print(A)
print('最小值元素索引%d'% np.argmin(A))
print('最大值元素索引%d'% np.argmax(A))
print('整个矩阵的均值%f'% np.mean(A))
print(np.average(A))
print(A.mean())
print(np.median(A)) #中位数
print(np.cumsum(A)) #累加,每个位置的数是前边位置的和
print(np.diff(A)) #累差运算
B=np.array([[3,5,9],[4,8,10]])
print(np.nonzero(B)) #将非零元素的行与列坐标分割开,重构成两个分别关于行和列的矩阵
A=np.arange(14,2,-1).reshape((3,4))
print(A)
print(np.sort(A))#只是对每行进行递增排序
print(np.transpose(A)) #矩阵转置
print(A.T)
print(A)
print(np.clip(A,5,9))
#clip(Array,Array_min,Array_max)
#若Array中的元素在[Array_min,Array_max],则该对应位置为原数
#若Array中的元素在<Array_min,则该对应位置为Array_min
#若Array中的元素在>Array_max,则该对应位置为Array_max
[[ 2 3 4 5]
[ 6 7 8 9]
[10 11 12 13]]
最小值元素索引0
最大值元素索引11
整个矩阵的均值7.500000
7.5
7.5
7.5
[ 2 5 9 14 20 27 35 44 54 65 77 90]
[[1 1 1]
[1 1 1]
[1 1 1]]
(array([0, 0, 0, 1, 1, 1], dtype=int64), array([0, 1, 2, 0, 1, 2], dtype=int64))
[[14 13 12 11]
[10 9 8 7]
[ 6 5 4 3]]
[[11 12 13 14]
[ 7 8 9 10]
[ 3 4 5 6]]
[[14 10 6]
[13 9 5]
[12 8 4]
[11 7 3]]
[[14 10 6]
[13 9 5]
[12 8 4]
[11 7 3]]
[[14 13 12 11]
[10 9 8 7]
[ 6 5 4 3]]
[[9 9 9 9]
[9 9 8 7]
[6 5 5 5]]
#列表转为矩阵
array=np.array([[1,3,5],[4,6,9]])
print(array)
[[1 3 5]
[4 6 9]]
#维度
print('number of dim:',array.ndim)
number of dim: 2
#行数和列数
print('shape:',array.shape)
shape: (2, 3)
#元素个数
print('size:',array.size)
size: 6
3 索引和切片
A=np.arange(3,15)
print(A)
B=A.reshape(3,4)
print(B)
print(B[2])
print(B[0,2])
print(B[0][2])
print(B[1,1:3])
#打印行
for row in B:
print(row)
#打印列
for columns in B.T:
print(columns)
#多维转一维
A=np.arange(3,15).reshape((3,4))
print(A)
print(A.flatten())
#flat是一个迭代器,本身是一个object属性
for item in A.flat:
print(item)
[ 3 4 5 6 7 8 9 10 11 12 13 14]
[[ 3 4 5 6]
[ 7 8 9 10]
[11 12 13 14]]
[11 12 13 14]
5
5
[8 9]
[3 4 5 6]
[ 7 8 9 10]
[11 12 13 14]
[ 3 7 11]
[ 4 8 12]
[ 5 9 13]
[ 6 10 14]
[[ 3 4 5 6]
[ 7 8 9 10]
[11 12 13 14]]
[ 3 4 5 6 7 8 9 10 11 12 13 14]
3
4
5
6
7
8
9
10
11
12
13
14
4 数组合并
#数组合并
A=np.array([1,1,1])
print(A)
B=np.array([2,2,2])
print(np.vstack((A,B))) #vertical stack上下合并
C=np.vstack((A,B))
print(C)
print(A.shape,B.shape,C.shape)
D=np.hstack((A,B))
print(D)
print(A.shape,B.shape,D.shape)
#
[1 1 1]
[[1 1 1]
[2 2 2]]
[[1 1 1]
[2 2 2]]
(3,) (3,) (2, 3)
[1 1 1 2 2 2]
(3,) (3,) (6,)
#深度合并
b=np.array([[0,1,20,3,4,5],[6,7,8,9,10,11]])
c=b*2
arr_dstack=np.dstack((b,c))
print(arr_dstack.shape)
arr_dstack
(2, 6, 2)
array([[[ 0, 0],
[ 1, 2],
[20, 40],
[ 3, 6],
[ 4, 8],
[ 5, 10]],
[[ 6, 12],
[ 7, 14],
[ 8, 16],
[ 9, 18],
[10, 20],
[11, 22]]])
#数组转置为矩阵
print(A[np.newaxis,:])
print(A[np.newaxis,:].shape)
print(A[:,np.newaxis])
[[1 1 1]]
(1, 3)
[[1]
[1]
[1]]
#多个矩阵合并p
print(A)
print(B)
A=A[:,np.newaxis] #数组转置
B=B[:,np.newaxis] #数组转置
print(A)
print(B)
[1 1 1]
[2 2 2]
[[1]
[1]
[1]]
[[2]
[2]
[2]]
#纵向合并
C1=np.concatenate((A,B),axis=0)
print(C1)
[[1]
[1]
[1]
[2]
[2]
[2]]
#横向合并
C2=np.concatenate((A,B),axis=1)
print(C2)
[[1 2]
[1 2]
[1 2]]
5 数组拆分
#构造矩阵
A=np.arange(12).reshape((3,4))
print(A)
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
#沿横向轴拆分(axis=1)
np.hsplit(A,2)
[array([[0, 1],
[4, 5],
[8, 9]]), array([[ 2, 3],
[ 6, 7],
[10, 11]])]
np.split(A,2,axis=1)
[array([[0, 1],
[4, 5],
[8, 9]]), array([[ 2, 3],
[ 6, 7],
[10, 11]])]
print(A)
#沿纵向轴拆分(axis=0)
np.vsplit(A,3)
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8, 9, 10, 11]])]
np.split(A,3,axis=0)
[array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8, 9, 10, 11]])]
#深度拆分
arr_dstack
array([[[ 0, 0],
[ 1, 2],
[20, 40],
[ 3, 6],
[ 4, 8],
[ 5, 10]],
[[ 6, 12],
[ 7, 14],
[ 8, 16],
[ 9, 18],
[10, 20],
[11, 22]]])
np.dsplit(arr_dstack,2)
[array([[[ 0],
[ 1],
[20],
[ 3],
[ 4],
[ 5]],
[[ 6],
[ 7],
[ 8],
[ 9],
[10],
[11]]]), array([[[ 0],
[ 2],
[40],
[ 6],
[ 8],
[10]],
[[12],
[14],
[16],
[18],
[20],
[22]]])]
6 copy和=
#=号赋值的关联性
a=np.arange(4)
print(a)
[0 1 2 3]
b=a
c=a
d=b
print(b)
print(c)
print(d)
[0 1 2 3]
[0 1 2 3]
[0 1 2 3]
a[0]=11 #a中元素发生改变,b,c,d中的元素同样变化
print(a)
print(b)
print(c)
print(d)
[11 1 2 3]
[11 1 2 3]
[11 1 2 3]
[11 1 2 3]
d[1:3]=[12,13] #d中元素发生变化,a,b,c中的元素同样变化
print(a)
print(b)
print(c)
print(d)
[11 12 13 3]
[11 12 13 3]
[11 12 13 3]
[11 12 13 3]
#copy()赋值没有关联性
a=np.arange(4)
print(a)
b=a.copy()
print(b)
[0 1 2 3]
[0 1 2 3]
a[3]=44
print(a)
print(b)
[ 0 1 2 44]
[0 1 2 3]
7 广播机制
当数组跟一个标量进行计算时,标量需要根据数组的形状进行扩展,然后执行运算。该扩展过程称为“广播”
a=np.array([[0,0,0],[10,10,10],[20,20,20],[30,30,30]])
b=np.array([0,1,2])
print(a+b) #a,b的维度不一样,在进行计算的时候会将b广播后计算
[[ 0 1 2]
[10 11 12]
[20 21 22]
[30 31 32]]
#相当于将b重复多次
b=np.tile([0,1,2],(4,1)) #b行重复4次,列重复1次
print(a)
print(b)
print(a+b)
[[ 0 0 0]
[10 10 10]
[20 20 20]
[30 30 30]]
[[0 1 2]
[0 1 2]
[0 1 2]
[0 1 2]]
[[ 0 1 2]
[10 11 12]
[20 21 22]
[30 31 32]]
8 数组的类型转换
#数组转换成list,使用tolist()
a=np.array([[0,1,20,3,4,5],[6,7,8,9,10,11]])
print(a.tolist())
#转换成指定类型
print(a.astype(float))
[[0, 1, 20, 3, 4, 5], [6, 7, 8, 9, 10, 11]]
[[ 0. 1. 20. 3. 4. 5.]
[ 6. 7. 8. 9. 10. 11.]]
9 常用函数
#bincount()计算索引出现次数
x=np.array([1,2,3,3,0,1,4,0])
print(np.bincount(x))
#索引0出现2次,索引1出现2次,索引2出现1次,索引3出现2次,索引4出现1次,所以输出[2,2,1,2,1]
#x中最大数为4,那么bin中统计的索引只能为0-4的5个数字,统计它们在x中出现的次数
[2 2 1 2 1]
w=np.array([0.3,0.5,0.7,0.6,0.1,-0.9,1,0.2])
print(np.bincount(x,weights=w))
[ 0.3 -0.6 0.5 1.3 1. ]
print(np.bincount(x,weights=w,minlength=7)) #bincount中元素为5个,当设置长度为7时,后边两位设为0
[ 0.3 -0.6 0.5 1.3 1. 0. 0. ]
#argmax
x=[[1,3,3],[7,5,2]]
print(np.argmax(x)) #返回最大元素中的位置
print(np.argmax(x,axis=0)) #按列操作返回最大元素的索引位置
print(np.argmax(x,axis=1)) #按行操作返回最大元素的索引位置,对于同为最大值,返回第一个的位置索引即可
3
[1 1 0]
[1 0]
#求取精度
print(np.around([-0.6,1.2798,2.357,9.67,13],decimals=0))
[-1. 1. 2. 10. 13.]
print(np.around([1.2798,2.357,9.67,13],decimals=1))
[ 1.3 2.4 9.7 13. ]
print(np.around([1.2798,2.357,9.67,13],decimals=2)) #decimals指定保留有效数的位数
[ 1.28 2.36 9.67 13. ]
print(np.around([1,2,5,6,56],decimals=-1)) #-1表示看最后一位数决定是否进位,大于5进位,小于5省去
[ 0 0 0 10 60]
print(np.around([1,2,5,6,56],decimals=-2)) #-2表示看最后两位数决定是否进位,大于50进位,小于50省去
[ 0 0 0 0 100]
#取整
#向下取整
np.floor([-0.6,-1.4,-0.1,-1.8,0,1.4,1.7])
array([-1., -2., -1., -2., 0., 1., 1.])
#向上取整
np.ceil([1.2,1.5,1.8,2.1,2.0,-0.5,-0.6,-0.3])
array([ 2., 2., 2., 3., 2., -0., -0., -0.])
#查找
x=np.array([[1,0],[2,-2],[-2,1]])
x
array([[ 1, 0],
[ 2, -2],
[-2, 1]])
np.where(x>0,x,0) #大于0的数不变,小于0的值用0填充
array([[1, 0],
[2, 0],
[0, 1]])