1 读/写文件
读/写文件是利用numpy进行数据处理的基础。numpy提供了若干函数,可以把结果保存到二进制或文本文件中,除此之外,numpy还提供了许多从文件读取数据并将其转换为数组的方法。
- save函数:以二进制的格式保存数据
- load函数:从二进制文件中读取数据
save语法格式:
np.save(file,arr,allow_pickle=True,fix_imports=True)
- file:要保存的文件的名称,需要指定文件保存的路径,如果未设置,则保存到默认路径下面
- arr:需要保存的数组。即把数组arr保存至名称“file”的文件中,其文件的扩展名’.npy’是系统自动添加的
例如:
二进制存储
arr = np.arange(100).reshape(10,10)
np.save("save_arr",arr)
print('保存的数组为:\n',arr)
输出:
多个数组保存在一个文件中
savez函数,其文件扩展名为’.npz’
例如
arr1 = np.array([[1,2,3],[4,5,6]])
arr2 = np.arange(0,1.0,0.1)
np.savez('savez_arr',arr1,arr2)
print('保存的数组1为:\n',arr1)
print('保存的数组2为:',arr2)
输出:
load函数
读取二进制文件的时候用load函数,用文件名作参数
读取单个数组的文件
loaded_data = np.load("save_arr.npy")
print('读取的数组为:',loaded_data)
输出:
读取多个数组的文件
loaded_data1 = np.load("savez_arr.npz")
print('读取的数组1为:\n',loaded_data1['arr_0'])
输出:
print('读取的数组2为:\n',loaded_data1['arr_1'])
输出:
注意:存储时可以省略扩展名,但读取时不能省略扩展名
在实际的数据分析任务中,更多地使用文本格式的数据,如txt或csv格式,因此,经常使用savetxt函数、loadtxt函数、genfromtxt函数执行对文本格式数据的读取任务。
savetxt函数
该函数可以将数组写到以某种分隔符隔开的文本文件中,语法格式如下:
np.savetxt(fname,X,fmt='%.18e',delimiter=' ',newline='\n',header=' ',footer=' ',comments='# ')
- fname:文件名
- X:数组数据
- fmt:数据类型
- delimiter:数据分隔符"delimiter"
loadtxt函数
loadtxt函数执行的是相反的操作,即把文件加载到一个二维数组中。
例如:
arr = np.arange(0,12,0.5).reshape(4,-1)
print('创建的数组为:\n',arr)
#fmt = "%d"表示保存为整数
np.savetxt("arr.txt",arr,fmt="%d",delimiter = ",")
#读入的时候也需要指定逗号分隔
loaded_data = np.loadtxt("arr.txt",delimiter = ",")
print('读取的数组为:\n',loaded_data)
输出:
genfromtxt函数
该函数和loadtxt函数相似,不过它面向的是结构化数组和缺失数据,它通常使用的参数有3个,即存放数据的文件名参数“fname”,分隔符“delimiter”和是否含有列标题参数“names”
例如:
loaded_data = np.genfromtxt("arr.txt",delimiter = ",")
print('读取的数组为:\n',loaded_data)
输出:
输出的结果是一组结构化的数据,结构化数组可以用dtype选项指定一系列用逗号隔开的说明符,指明构成结构体的元素以及他们的数据类型和顺序。数据从第二行开始。
2 使用函数进行统计分析
2.1 排序
- 直接排序:对数值直接进行排序,使用sort函数。
- 简介排序:根据一个或多个键对数据集进行排序,使用argsort函数和lexsort函数。
sort函数
该函数是最常用的排序方法,无返回值。如果目标函数是一个视图,则原始数据将会被修改。使用sort函数排序时可以指定一个axis参数,使得sort函数可以沿着指定轴对数据集进行排序。
例如:
直接排
np.random.seed(42)#设置随机种子
arr=np.random.randint(1,10,size=10)#生成随机数组
print('创建的数组为:',arr)
arr.sort()#直接排序
print('排序后:',arr)
输出:
沿横纵轴排序
arr = np.random.randint(1,10,size=(3,3))
print('创建的数组为:\n',arr)
arr.sort(axis = 1)
print('排序后的数组为:\n',arr)
arr.sort(axis = 0)
print('排序后的数组为:\n',arr)
输出:
使用argsort函数和lexsort函数,可以在给定一个或多个键时,得到一个由整数构成的索引数组,索引值表示数据在新的序列中为位置。
使用argsort函数排序
arr = np.array([2,3,6,8,0,7])
print('创建的数组为:',arr)
print('排序后的数组为:',arr.argsort())
输出:(返回值为重排的下标)
使用lexsort函数排序
该函数可以一次性对满足多个键的数组执行间接排序,例如
a = np.array([3,2,6,4,5])
b = np.array([50,30,40,20,10])
c = np.array([400,300,600,100,200])
d = np.lexsort((a,b,c))
#多个键值排序时是按照最后一个传入数据计算的
print('排序后数组为:',list(zip(a[d],b[d],c[d])))
输出:
2.2 去重与重复数据
2.2.1 去重
在统计分析工作中,经常会有重复数据,若一个一个手动删除,耗时费力,效率低。在numpy中,可以通过unique函数找出数组中的唯一值并返回已排序的结果。如下所示:
names = np.array(['小明','小花','小明','小张'])
print('创建的数组为:',names)
print('去重后的数据为:',np.unique(names))
输出:
跟np.unique等价的代码
print('去重后的数据为:',sorted(set(names)))
输出:
例2
ints = np.array([1,2,3,4,4,5,6,6,7,8,8,9,10])
print('创建的数组为:',ints)
print('去重后的数组:',np.unique(ints))
输出:
2.2.2 重复数据
重复数据用tile函数和repeat函数
tile函数形式:np.tile(A,reps)
- A:指定重复的数组
- reps:重复的次数
例如:
arr = np.arange(5)
print('创建的数组为:',arr)
print('重复后数组为:',np.tile(arr,3))
输出:
repeat函数形式如下:np.repeat(a,repeats,axis=None)
- a:重复的数组元素
- repeats:重复次数
- axis:沿着哪个轴进行重复
np.random.seed(42)
arr = np.random.randint(0,10,size=(3,3))
print('创建的数组为:\n',arr)
print('重复后数组为:\n',arr.repeat(2,axis = 0))
print('重复后数组为:\n',arr.repeat(2,axis = 1))
输出:
两个函数区别:tile函数是对数组进行重复操作,repeat函数是对数组中的每个元素进行重复操作。
2.3 常用统计函数
常用统计函数有sum、mean、std、var、min和max等等。
几乎所有的统计函数在针对二维数组计算的时候都需要注意轴的概念。
当axis=0,表示沿纵轴计算。
当axis=1,表示沿横轴计算。
默认时,并不按照任一轴向计算,而是计算一个总值。
例如:
arr = np.arange(20).reshape(4,5)
print('创建的数组为:',arr)
print('数组的和为:',np.sum(arr))
print('数组纵轴的和为:',arr.sum(axis=0))
print('数组横轴的和为:',arr.sum(axis=1))
print('数组的均值为:',np.mean(arr))
print('数组纵轴的均值为:',arr.mean(axis=0))
print('数组横轴的均值为:',arr.mean(axis=1))
print('数组的标准差为:',np.std(arr))
print('数组的方差为:',np.var(arr))
print('数组的最小值为:',np.min(arr))
print('数组的最大值为:',np.max(arr))
print('数组的最大值索引为:',np.argmin(arr))
print('数组的最大值索引为:',np.argmax(arr))
输出:
上述函数的计算均为聚合计算,直接显示计算的最终结果
在numpy中,cumsum函数和cumprod函数采用不聚合计算,产生一个由中间结果组成的数据,如下:
arr = np.arange(2,10)
print('创建的数组为:',arr)
print('数组元素的累积和为:',np.cumsum(arr))
print('数组元素的累积积为:',np.cumprod(arr))
输出:
3 小案例
读取iris数据集中的花萼长度数据(csv格式),并对其进行统计分析。
#读数据
iris_sepal_length = np.loadtxt("iris_sepal_length.csv",delimiter=",")
print('花萼长度表为:',iris_sepal_length )
#排序
iris_sepal_length.sort()
print('排序后的花萼长度为:',iris_sepal_length)
#去重
print('去重后的花萼长度为:',np.unique(iris_sepal_length))
#总和
print('花萼长度表的总和为:',np.sum(iris_sepal_length))
#所有元素累计和
print('花萼长度表的累计和为:',np.cumsum(iris_sepal_length))
#均值
print('花萼长度表的均值为:',np.mean(iris_sepal_length))
#标准差
print('花萼长度表的标准差为:',np.std(iris_sepal_length))
#方差
print('花萼长度表的方差为:',np.var(iris_sepal_length))
#最小值
print('花萼长度表的最小值为:',np.min(iris_sepal_length))
输出: