1.创建数组
import numpy as np
# ————创建数组————
np.array([1,2,3,4])
np.array(range(10))# 迭代对象
np.array([i for i in range(10) if i%2==0]) #列表,[]列表推导式返回列表
np.array([i for i in range(10) if i%2==0]) #()# 生成器,列表推导式返回生成器
a = np.array([1.1,2.2,3.3],dtype='int') #强制使用int类型
b = np.array(a, copy=False) # copy为False 不会发生深拷贝,不创建副本
b = a.copy() # 深拷贝
np.array([1,2,3],ndmin=2) #ndmin指定维度,reshape方法可以修改维度
np.array(np.mat([1,2,3]),subok=True) #subok保持原类型(如矩阵mat)
2.快速生成数组
#————快速生成数组————
# np.arange()生成np数组
np.arange(1,10,2) # [1,10) step=2
np.arange(4.2,dtype='float') # 可以有浮点类型
# 生成数目:ceil(stop-start)/step) 浮点数的不精确可能导致数目意料之外的结果
#np.linspace()生成等差np数组
np.linspace(1,10,num=2,endpoint=True,dtype='float')
# endpoint=True表示生成数组包含stop=10,生成num个元素的数组,类型为dtype
#np.logspace()生成等比数列数组
np.logspace(0,9,10,base=2,endpoint=True,dtype='float') #等价于2**linspace(0,9,10,dtype='float')
#np.zeros()生成零数组、np.ones()生成全1数组
a=np.array([1,2,3])
np.zeros((2,2),dtype='int')
np.zeros_like(a) #(3,)
3.数组属性
# ————数组属性————
m = np.array([[1,2,3],[4,5,6]])
print(m.ndim)#维数
print(m.shape)#数组的 维度、形状
n1 = m.reshape((3,2)) # 改变shape,不改变原数组,返回副本
print(m.size)#元素总数
n2 = np.resize((2,6)) # 改变size,不改变原数组,返回副本,用原数组填充
#通常是使用resize改变数组的尺寸大小;使用reshape用来增加数组的维度,不改变数组数组数据
print(m.dtype)#类型
n3 = m.astype('float32') ## 改变type,不改变原数组,返回副本
np.array([1,2,3,'4']) # 不指定dtype,按照最大的类型进行安排
np.array([[1,2,3],('a','b','c','d')]) #不指定dtype,维度间元素数量不匹配的退化为一维,dtype为object
np.array([1,2,3],(1,2,3)) #二维
print(m.itemsize)#每个元素所占字节大小
4.数据类型和结构化数据
# numpy数据类型
# str_和string_区别
str1 = np.array([1,2,3,4,5,6],dtype=np.str_)
string1 = np.array([1,'abcd',3,4,5,6],dtype=np.string_)
str2 = np.array(['我们',2,3,4,5,6],dtype=np.str_)
# string2 = np.array(['我们',2,3,4,5,6],dtype=np.string_)
print(str1,str1.dtype)
print(string1,string1.dtype)
print(str2,str2.dtype)
# ['1' '2' '3' '4' '5' '6'] <U1
# [b'1' b'abcd' b'3' b'4' b'5' b'6'] |S4
# ['我们' '2' '3' '4' '5' '6'] <U2
#定义结构化数据
teacher1 = np.dtype([('name','U5'),('salary','f4')])
t = np.array([('zf',6000.5),('fz',7000)],dtype=teacher1)
t
5.索引和切片
#切片索引
# 一维
ar1 = np.array(range(10))
ar1[1:6:1] # start:stop:step 不包括stop,负数表示从尾部或逆向step
ar1[[0,3,4]] # 选取第0、3、6个元素
# 二维
ar2 = np.array(range(20)).reshape(5,4)
ar2[0] #取第一维数组
ar2[0][1] #二次索引 ,取第一维第二个元素
ar2[::-1][0::1]# 二次索引,从第一次所选的结果里在此选择,都可以使用start:stop:step
ar2[:,3] # 逗号分隔每个维度 还可以用...代表全选
ar2[[0,1,0,1],[0,1,2,3]] # 整数数组索引(0,0),(1,1),(0,2),(1,3),数量要对应,除非有一个[]里是一个
ar2[(ar2>2) & (ar2<8)] # 布尔索引
ar2[[True,True,True,True,False]][[False, True,False, True]]
np.s_[1:4,2:6] # 生成索引
np.r_[1:4,2:6] #在行上连接切片
np.c_[1:4,2:5] #在列上连接切片
6.数组方法
# 操作数组的方法
a = np.array([[1,2,3],[4,5,6]])
b = np.resize(a,(3,3)) #维度不够用原数组补齐
a = np.array([[1,2,3],[4,5,6]])
np.append([[1,2,3],[1,2,3]],[0,1,0,1]) # 返回一维数组
np.append([[1,2,3],[1,2,3]],[[4,5],[4,5]],axis=1) # 沿列添加
np.append([[1,2,3],[1,2,3]],[[4,5,6],[4,5,6]],axis=0) #沿行添加
a = np.array([[1,2],[3,4],[5,6]])
print (np.insert(a,1,[[11,12]],axis = 0)) #在1位置,按行添加[[11,12]],不加axis展开为1维
x = np.arange(6).reshape(2,3)
x1 = np.argwhere(x>1) #返回数组中非零元素索引
a=np.array([5,2,6,2,7,5,6,8,2,9])
a1 = np.unique(a) # 对a数组的去重
a2,ids2 = np.unique(a,return_index=True) #返回去重后数组在原数组的索引
a3,ids3 = np.unique(a,return_inverse=True) #返回去原数组在去重后数组的索引
a4,nums = np.unique(a,return_counts=True) #返回去重数组出现次数
a = np.array([[3,7,5],[6,1,4],[4,7,9]])
a1 = np.sort(a) #默认按最后一个轴方向排
a2 = np.sort(a,axis=0) # 在列内排
a3 = np.sort(a,axis=0) # 在行内排
# 此外,kind参数表示排序方法,order表示按属性名(某个字段排序)
t = np.dtype([('name','U5'),('age',int)])
a4 = np.array([('zf',22),('yx',20),('kq',19)],dtype=t)
np.sort(a4,axis=0,order='name')
#np.argsort()返回排序好的在原数组的元素索引
7.广播机制
b = np.delete(a,[1,2],axis = 0)# 返回新数组,按行删除数组1、2行,不加axis展开为1维
# 广播机制
# 形状不相同的数组进行运算时采用广播机制使数组形状相同
# 维度不相同,在低纬度形状左边加1 (3,)->(1,3)
# 数组形状沿着某个长度为1的维度扩展,去匹配另一个数组
# 任意维度不匹配且没有一个维度为1,无法广播
# 另一种简单理解
# - 将两个数组的维度大小右对齐,然后比较对应维度上的数值,
# - 如果数值相等或其中有一个为1或者为空,则能进行广播运算,
# - 输出的维度大小为取数值大的数值。否则不能进行数组运算。
a = np.array([1,2,3])
b = np.ones((3,3))
a+b
8.统计函数和相关分布的随机函数
# 统计函数
# 平均数
a = np.arange(20).reshape(4,5)
a.mean() # 全部元素的平均值
a.mean(axis=0) # 按列求平均值
a.mean(axis=1) # 按行求平均值
# 中位数
np.median(a)
np.median(a,axis=0)
np.median(a,axis=1)
# 标准差
np.std(a)# 也可以有axis参数
# 方差
np.var(a)# 也可以有axis参数
# 最值和求和 有axis参数
a.max()
a.min()
a.sum()
# 平均数
# 可以有axis参数、weight参数表示权重,默认权重都是1
# 随机函数
np.random.seed(1)# 对每一个随机函数前都设置一个随机种子,结果在多次运行后会一致
np.random.rand(4,2) # 生成4行2列[0,1)均匀分布随机浮点数
np.random.sample((4,2))# 生成4行2列[0,1)均匀分布随机浮点数数,函数内部使用rand()
np.random.randint(low =1,high=11,size=1000) #生成[0,low)(未说明high)或[low,high) size形状的均匀分布整数随机数
np.random.randn(4,2) # 生成4行2列[0,1)标准正态分布随机数
np.random.normal(loc=0,scale=1,size=(3,4))# # # 生成3行4列[0,1)N(loc,scal^2)正态分布随机数
9.读取文件
# 读取文件
# 文件内容: 1 2 3 4
d1 = np.loadtxt('data1.txt',dtype=np.int32)
# 文件内容: 1,2,3,4
d1 = np.loadtxt('data2.csv',dtype=np.int32,delimiter=',')
# 文件内容:姓名 工资
# zf 6000
# fz 7000
teacher1 = np.dtype([('name','U5'),('salary','f4')])
d2 = np.loadtxt('teachers.txt',dtype=teacher1,encoding='utf-8',skiprows=1)# skiprows=1 跳过一行
# 此外usecols=(1,3)表示读取第1、3列(从0计)
# 参数converters={1:myfun1,3:myfun2}表示第1列的值作用自定义函数myfun1,可用于缺失值处理