认识numpy基础数据结构
# 认识数组
ar = np.array([[1,2,3,4,5],[6,7,8,9,10]])
br = [[1,2,3,4,5],[6,7,8,9,10]]
print(ar,type(ar)) # n维数组称为ndarray
print(br,type(br)) #列表
print(ar.ndim) # 输出数组有几维 ( 'list' object has no attribute 'ndim')
print(ar.shape) #shape 输出数组几行几列 print(ar.size) #size 输出数组共有几个元素
结果:
#创建数组(生成器+列表)
ar1 = np.array(range(10)) # 生成器range(10)为0-9的整数
ar2 = np.arange(10) # 生成0-9的整数
ar3 = np.array([1,2,3,4,5]) # 用列表生成 (数组整型)
ar4 = np.array([[1,2,3,4,5],['a','b','c','d','e']]) # 用列表生成 (数组字符型)
ar5 = np.array([[1,2,3,4,5],['a','b','c','d','e','g']]) # 用列表生成,元素个数不一样导致变成列表
ar6 = np.random.rand(10).reshape(2,5) #生成0-1的值10个,形状是2行5列
print(ar1)
print(ar2)
print(ar3)
print(ar4,ar4.ndim) # 2维数组
print(ar5,ar5.ndim) # 列表
print(ar6,ar6.ndim) # 2维数组
结果:
# arange()的用法
print(np.arange(10)) # 0-9的整数
print(np.arange(5,12)) # 5-11的整数
print(np.arange(10.0)) # 0-9的浮点数
print(np.arange(5.0,12,2)) # 5.0-12.0 步常为2的数
结果:
#linspace()的用法 --[开始,结尾]上计算的num个均匀间隔的样本 print(np.linspace(10,20,21,endpoint=True,retstep=False)) # retstep是否输出间隔,true为输出默认false print(np.linspace(10,20,21,endpoint=False,retstep=True)) # endpoint包不包括结尾的数,默认true为包括 print(np.linspace(10,20,21,retstep=True))
s = np.linspace(10,20,21,retstep=True)
print(type(s)) #类型为tuple,元组 结果:
# zeros()/zeros_like()/ones()/ones_like()
print(np.zeros(10)) # 输出10个0,默认为浮点型数值
print(np.zeros((2,5),dtype=int)) #创建2行5列的数组,数值类型为整型
cr = np.array([list(range(10)),list(range(10,20))])
dr = np.arange(20).reshape(2,10)
print(cr)
print(dr)
print(np.zeros_like(dr)) # 创建像dr一样的,元素为0的数组
结果:
# eye() 创建n*n的单位矩阵,对角线是1,其余为0 print(np.eye(5))
结果:
# 数组形状 .T/np.reshape()/np.resize() 都是生成新的数组,不会改变原数组
# .T 转置函数 shape为(3,4)/(2,3,4)转化为(4,3)/(4,3,2) 一维数值转置后不变
er = np.array(range(16))
er1 = np.zeros((2,5))
er2 = er.reshape(8,2)
print(er)
print(er.T)
print(er1)
print(er1.T)
print(er2)
print(np.ones((2,5)).reshape(5,2))
print(np.reshape(np.arange(16),(2,8)))
# np.resize() 根据重新设定的size进行变化,数值可能因为size而循环也可能截断
print(np.resize(np.arange(3),(3,4)))
print(np.resize(np.arange(14),(3,4)))
结果:
# 数组的复制 fr1.copy()
fr1 = np.arange(10)
fr2 = fr1
print(fr1 is fr2)
fr1[0] = 100
print(fr1,fr2) # fr1,fr2都会改变
fr3 = fr1.copy()
fr1[1] = 1000
print(fr1,fr3) # fr3 不会改变
结果:
# 数组类型改变 .astype()
gr1 = np.arange(10,dtype = float) #整型改为float型
gr2 = gr1.astype(np.int64) #又改为整型int64
print(gr1,gr1.dtype)
print(gr2,gr2.dtype)
结果:
#数组堆叠
a = np.arange(5)
b= np.arange(5,10)
print(a,b)
print(np.hstack((a,b))) # 横向连接
print(np.vstack((a,b))) # 竖向连接 变成(2,5)的数组(数字个数一定相同否则会报错)
a1 = np.array([[1],[2],[3],[4],[5]])
b1 = np.array([['a'],['b'],['c'],['d'],['e']])
print(a1)
print(b1)
print(np.hstack((a1,b1))) # 变成(5,2)的数组
print(np.vstack((a1,b1))) # 变成(10,1)的数组
print(np.stack((a,b))) # 若只是stack,默认是axis = 0 默认竖向连接
print(np.stack((a,b),axis =1)) # axis = 1,则是横向连接
结果:
#数组拆分
a2 = np.arange(16).reshape(4,4)
print(a2)
print(np.hsplit(a2,2)) # 横向拆分成两列
print(np.hsplit(a2,2)[1])
print(np.vsplit(a2,4)) # 竖向拆分成4行
print(np.vsplit(a2,4)[1])
结果:
#数组的计算
a3 = np.arange(1,7).reshape(2,3)
print(a3)
print(a3+1) # 每个数值加1
print(a3 * 2) # 每个数值乘以2
print(1/(a3+1)) # 混合运算
print(a3.max(),'/',a3.min())
print(a3.mean(),'/',a3.std(),'/',a3.var())
print(a3.sum(),np.sum(a3,axis = 0 ),np.sum(a3,axis =1 )) #axis=0竖向求和,axis=1横向求和
print(np.sort(np.array([1,4,3,2,6]))) # 排序
结果:
# 一维数组 a4 = np.arange(3,20) print(a4) print(a4[4]) #第五个值 print(a4[:3]) #前三个值 print(a4[2:5]) #第三,四,五个值 print(a4[::2]) #以2的步长取值
结果:
# 二维数组 a5 = np.arange(16).reshape(4,4) print(a5) print(a5[2]) print(a5[2][2]) print(a5[1:3]) print(a5[2,2]) # 中间是逗号,表示索引为2的列(第三列)与索引为2的行 就是10 print(a5[:1,2:]) # 逗号前为行,则是第1行,逗号后为列,则是第3,4列,就是[2,3]
结果:
# 三维数组 a6 = np.arange(12).reshape(3,2,2) # 3个3行3列 print(a6) print(a6[2]) print(a6[2][0]) print(a6[2][0][1])
结果:
#布尔型索引与切片 保留为true的值 a7 = np.arange(12).reshape(3,4) print(a7) i = np.array([True,False,True]) j = np.array([True,True,False, False]) print(i) print(j) print(a7[i,:]) # 逗号前是行的选择,i 中1,3是true,2是false,则选1,3行,逗号后是列,则全选 print(a7[:,j]) print(a7>5) print(a7[a7>5])
结果:
# 数组索引与切片的值的更改与复制 a8 = np.arange(10) a8[1] = 100 print(a8) a8[7:9] = 1000 print(a8) a9 = np.arange(10) a10 = a9.copy() a9[2] = 100 print(a9,a10)
结果: