当数据量庞大时,list列表速度很慢,使用numpy扩展库完成数组操作。
基本对象为
ndarray:存储单一数据类型的多维数组(数据元素类型应一致,若不一致,会自动向下进行转换float,string)
ufunc:对数组进行处理的通用函数
a = np.array([1,2,3,4]) #单个列表创建一维数组
b = np.array(((1,1,1),(2,2,2),(3.,3,3))) #嵌套元组创建二维数组
print(b) #当输入元素含有整形与浮点型时,输出的数组元素都转换成浮点型
[[1. 1. 1.]
[2. 2. 2.]
[3. 3. 3.]]
# 使用arange,empty,linspace等函数生成数组
a = np.arange(4,dtype=float) #创建浮点型数组[0.,1.,2.,3.]
b = np.arange(0,10,2,dtype=int) #创建整型数组[0,2,4,6,8]
c = np.empty((2,3),int) #创建2*3整形空矩阵
# empty函数只分配数组所用内存,不对数组元素初始化,运行速度最快
d = np.linspace(-1,2,5) #创建数组[-1,-0.25,0.5,1.25,2.]
e = np.random.randint(0,3,(2,3)) #生成[0,3)上的2行3列的随机整型数组
a = np.random.randint(1,101,(3,5)) #生成1-100间的3行5列的随机整数数组
print("维数ndim=",a.ndim)
print("维度shape=",a.shape)
print("元素总数size=",a.size)
print("类型dtype=",a.dtype)
print("每个元素字节数itemsize=",a.itemsize)
维数ndim= 2
维度shape= (3, 5)
元素总数size= 15
类型dtype= int32
每个元素字节数itemsize= 4
# 布尔索引
a = np.array([[1,np.nan,2],[4,np.nan,0]])
b = a[~np.isnan(a)] #提取a中非nan的数
print("b中大于1的有",b[b>1])
b中大于1的有 [2. 4.]
# 花式索引
# 一维数组的索引结果是对应位置元素
a = np.array([1,2,3,4,5])
a[[1,3]]
# 二维数组的索引结果是对应下标的行
a = np.array([[1,1],[2,2],[3,3],[4,4]])
a[[0,2]]
array([[1, 1],
[3, 3]])
数组元素的修改 数组维数的扩大或缩小
# 数组元素的修改
x = np.array([[0,0,0],[1,1,1],[2,2,2]])
x[0,1] = -1 #修改第一行第二个元素为-1
#删除行/列
y = np.delete(x,0,axis=0) #删除数组的第0行
print(y)
z = np.delete(x,2,axis=1) #删除数组的第3列
print(z)
#增加行/列
h = np.append(x,[[3,3,3]],axis=0) #增加一行
print(h)
l = np.append(x,[[0],[1],[2]],axis=1) #增加一列
print(l)
[[1 1 1]
[2 2 2]]
[[ 0 -1]
[ 1 1]
[ 2 2]]
[[ 0 -1 0]
[ 1 1 1]
[ 2 2 2]
[ 3 3 3]]
[[ 0 -1 0 0]
[ 1 1 1 1]
[ 2 2 2 2]]
使用reshape函数改变数组的维度,指定数组在每个维度上的大小,同时不改变原始数据的值。若指定维度与size不吻合则抛出异常
a = np.arange(8)
#reshape不改变原数组,返回视图
print(a,'变形后:\n',a.reshape(2,4))
# resize将原数组改变,没有返回值
print(a.resize(4,2),'变形后:\n',a)
[0 1 2 3 4 5 6 7] 变形后:
[[0 1 2 3]
[4 5 6 7]]
None 变形后:
[[0 1]
[2 3]
[4 5]
[6 7]]
np.sin()
,np.cos()
,np.power()
# 1.简单四则运算
a = np.arange(1,10)
b = np.arange(11,20)
print(b*a) #对应元素相乘
# 整除的函数可以返回小数部分与整数部分
print(np.modf(b/a)[0]) #对应元素相除的小数部分
print(np.modf(a/b)[1]) #对应元素相除的整数部分
[ 11 24 39 56 75 96 119 144 171]
[0. 0. 0.33333333 0.5 0. 0.66666667
0.42857143 0.25 0.11111111]
[0. 0. 0. 0. 0. 0. 0. 0. 0.]
# 2.比较运算
a = np.random.randint(0,10,(10,))
b = np.random.randint(5,10,(10,))
print(a[a>=b]) #取出a中 a>=b的所有元素
print(a[a>7]) #取出a中 a>5的所有元素
print(np.where(a>5,-1,a)) #将a中大于5的元素改为-1
print(np.where(a>5,1,0)) #将a中大于5的元素改为1,否则为0
[8 5 6 8 9 6]
[8 8 9]
[-1 2 5 4 -1 5 -1 -1 2 -1]
[1 0 0 0 1 0 1 1 0 1]
# 3.ufunc函数的广播机制
a = np.arange(0,20,10).reshape(-1,1)
print(a)
b = np.arange(0,3)
print(b)
print(a+b)
[[ 0]
[10]]
[0 1 2]
[[ 0 1 2]
[10 11 12]]
# numpy运算函数
np.sqrt #开平方
np.sum
np.square?
np.power?
np.arccos?
np.cos(np.pi/2)
存取格式:
- 二进制文件:tofile,fromfile / load,save,savez
- 文本文件:savetxt,loadtxt
若处理复杂数据结构,如缺失数据,可以用genfromtxt函数
# 1. 文本文件的存取
a = np.random.uniform(0,6,6).reshape(2,3) #生成2*3的均匀数组
#写存 savetxt("文件名",数组)
np.savetxt("D:/ndarray_data.txt",a,fmt="%d",delimiter=",") #保存为整数,以,分隔
#读取 loadtxt("文件名")
b = np.loadtxt("D:/ndarray_data.txt",delimiter=",") #读取也以,分隔
print(b)
[[4. 3. 0.]
[0. 0. 3.]]
# 2. 二进制文件存取
a = np.arange(6).reshape(2,3)
# tofile("文件名")输出的数据不保存数组形状和元素类型
a.tofile("D:/ndarray_data.txt")
# fromfile()读数据时需要指定元素类型,并对数组形状修改
b = np.fromfile("D:/ndarray_data.txt",dtype=int).reshape(2,3)
print(b)
[[0 1 2]
[3 4 5]]