一.numpy读取数据

(一) 使用NumPy读写文本文件

1.将1维或2维数组写入TXT文件或CSV格式文件

​ (1) 写入后缀名为txt或csv的文件

​ (2) 语法: numpy.savetxt(fname,array,fmt=’%.18e’,delimiter=None,newline=’\n’, header=’’, footer=’’, comments=’# ‘, encoding=None)

参数 解释
fname 文件、字符串或产生器,可以是.gz或bz2压缩文件
array 存入文件的数组(一维数组或者二维数组)
fmt 写入文件的格式,如:%d,%.2f,%.18e,默认值是%.18e
delimiter 分隔字符串,默认是任何空格,改为逗号
newline 值可以\n,换行
header 头部加入注释
footer xxxxxxxxxx Emp_data = np.loadtxt(‘Employedpopulation.csv’,delimiter=”,”,usecols=(1,2,3,4,5,6,7,8,9,10),dtype=int)​#设置正常显示中文和负号plt.rcParams[‘font.sans-serif’] = [‘SimHei’]plt.rcParams[‘axes.unicode_minus’] = False​#创建一个绘图对象,并设置宽高plt.figure(figsize=(6,4))​#箱图,全部就业人员X = [Emp_data[1],Emp_data[2],Emp_data[3]] #将2007-2016年就业数据赋值给Xlabel = [‘全国就业’,’城镇就业’,’乡村就业’] #饼图标签explode = [0.01,0.01] #设定各项距离圆心的半径​plt.boxplot(X,notch=True,labels=label,meanline=True)#添加图例plt.legend({‘全国就业’,’城镇就业’,’乡村就业’})plt.show()python
comments 注释
encoding 编码
1
2
3
4
5
6
7
8
9
10
11
12
#保存txt文件
arr = np.arange(6).reshape(2,3)
#写入txt文件保存当前目录, 分隔符默认空格, 浮点型
np.savetxt('t1.txt',arr)
#写入int类型, 逗号分隔
np.savetxt('t2.txt',arr,fmt="%d",delimiter=",")
#写入字符串类型, 收尾加注释
np.savetxt('t3.txt',arr,fmt="%s",delimiter=",",header="t3",footer="t3")
#写入字符串类型, 头部加注释 ##t4注释
np.savetxt('t4.txt',arr,fmt="%s",delimiter=",",header="t4",comments="##")
#写入csv文件保存当前目录
np.savetxt('c.csv',arr)

2.读取TXT文件和CSV格式文件

读取TXT文件和CSV格式文件的函数是loadtxt().

(1) CSV: Comma-Separated Value, 逗号分隔值文件

​ 显示:表格状态

​ 源文件:换行和逗号分隔行列的格式化文本,每一行的数据表示一条记录

​ 由于csv便于展示,读取和写入,所以很多地方也是用csv的格式存储和传输中小型的数据,.

​ (2) 语法: np.loadtxt(fname.dtype=np.float,delimiter=None,skiprows=O,usecols=None ,unpack=False

参数 解释
fname 文件、字符串或产生器,可以是.gz或bz2压缩文件
dtype 数据类型,可选,CSV的字符串以什么数据类型读入数组中,默认np.float
delimiter 分隔字符串,默认是任何空格,改为逗号
skiprows 跳过前x行,一般跳过第一行表头
usecols 读取指定的列,索引,元组类型 (1,2)
unpack 如果True,读入属性将分别写入不同数组变量,False 读入数据只写入一个数组变量,默认False
1
2
3
4
5
6
7
8
9
10
11
#读取t1.txt文件
l1 = np.loadtxt('t1.txt')
#读取t2文件
l2 = np.loadtxt('t2.txt',delimiter=",")
#读取t3 后的数组为int8类型
l3 = np.loadtxt('t3.txt',dtype=np.int8,delimiter=",")
#读取t4
l4 = np.loadtxt('t4.txt',delimiter=",")
#读取csv
c = np.loadtxt('c.csv',delimiter=",")
print(c)

​ 3.案例: csv数据源

数据源为一个英国和美国各自youtube1000多个视频的点击,喜欢,不喜欢,评论数([“views”,”likes” ,”dislikes”,”comment total”)的csv.

​ 4.读取数据

​ np.loadtxt(US_video data numbers path,delimiter=”,”,dtype=int,unpack=1)
​ 注意其中添加delimiter和dtype以及unpack的效果
​ delimiter:指定边界符号是什么,不指定会导致每行数据为一个整体的字符串而报错dtype:郡认人情况下对于较 大的数据会将其变为科学计数的方式
​ upack:默认是Flase(O),默认情况下有多少条数据.就会有多少行为True(1)的情况下,每一列的数据会组成一行,原始数据有多少列,加载出来的数据就会有多少行,相当于转置的效果

1
2
3
#读取csv文件
uk_path = "data/US.csv"
u1 = np.loadtxt(uk_path,delimiter=",",dtype="int")

(二) 使用NumPy读写二进制格式文件

1.使用save()或savez()函数写二进制格式文件

语法:numpy.save(file,array) 或 numpy.savez(file,array)

参数说明: file:文件,以.npy为扩展名,压缩扩展名为.npz。

         array:数组变量。
1
2
3
#使用save()或savez()函数写二进制格式文件 numpy.save(file,array) 或 numpy.savez(file,array)
np.save('n1.npy',arr) #以.npy为扩展名,
np.savez('n1.npz',arr) #压缩扩展名为.npz

2.使用load()函数读取二进制格式文件

语法:numpy.load(file)

1
2
3
4
#使用load()函数读取二进制格式文件 numpy.load(file)
n1 = np.load('n1.npy')
n2 = np.load('n1.npz')
print(n1)

(三) 使用NumPy读写多维数据文件

1.使用tofile()函数写入多维数据文件

​ 语法: 数组名.tofile(fid, sep=’’, format=’%s’)

​ 参数说明:fid:文件、字符串,sep:数据分割符,format:写入数据的格式 。

2.使用fromfile()函数读取多维数据文件

​ 语法:numpy.fromfile(fid,dtype=float,count=‐1,sep=’’)

​ 参数说明:fid:文件、字符串,dtype:读取的数据类型。count:读入元素个数,‐1表示读入整个文件,sep:数据分割符。

1
2
3
4
5
#使用tofile()函数写入和fromfile()读取多维数据文件
a = np.arange(30).reshape(3,5,2)
# a.tofile('a.dat',sep=',',format='%d')
a1 = np.fromfile('a.dat', dtype=np.int8, sep=',').reshape((5, 3, 2))
print(a1)

二.常用的统计函数

方法 说明
sum 对数组中全部或某轴向的元素求和,零长度的数组的sum为0
mean 算数平均数,零长度的数组的mean为NaN
std、var 标准差和方差,自由度可调(默认为n)
min、max 最小值和最大值
argmin、argmax 分别为最小和最大元素的索引
cumsum 所有元素的累计和
cumprod 所有元素的累计积

(一) 求最大值和最小值的函数

求数组最大值的函数是amax()和nanmax(),求数组最小值函数是amin()和nanmin().相对于max和min函数,大型数组使用amax()和amin()性能会更好.

amax语法: numpy.amax(a , [axis = None[, out=None[, keepdims=False]]] )

参数说明: a:输入数据 , axis:指定沿着某个轴计算最大值(axis=0按列,axis=1按行,默认值None表示对整个数组)

​ out:替代输出数组.用于放置结果,默认值为None.

​ keepdims:默认值False, 输出行维度为1, 如果设置True, 则输出列维度为1.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#(一) 求最大值和最小值的函数
a1 = np.array([ [1,2,3,4], [5,6,7,8],[3,0,9,9] ])
#最大值
m1 = np.amax(a1)
#垂直方向最大值
m2 = np.amax(a1,axis=0)
#水平方向最大值
m3 = np.amax(a1,axis=1) #效率更高
m4 = np.max(a1,axis=1)

#nanmin函数求最小值
a2 = np.arange(3,dtype=float)
a2[1] = np.nan
min = np.nanmin(a2)#nanmin最小值是0.0,这是区别
min1 = np.amin(a2)#amin最小值是nan

(二) 求沿轴方向的取值范围

沿某轴axis方向上的最大值-最小区差值,即maximum-minimum的值形成的数组

1
2
3
4
5
6
# 2.  求沿轴方向的取值范围
arr1 = np.array([[ 0,1,2] , [2,4,5]])
print(arr1)
p1 = np.ptp(arr1,axis=0) #按垂直方向取值范围
p2 = np.ptp(arr1,axis=1) #按水平方向取值范围
print(p2)
1
2
3
4
5
6
7
#原数组
[[0 1 2]
[2 4 5]]
#按垂直方向取值范围效果
[2 3 3]
#按水平方向取值范围效果
[2 3]

(三)求百分位数

使用percentile()和nanpercentile()函数可以沿某轴axis方向计算数组中第q数值的百分位数

语法:numpy.percentile(a,q,axis=None,out=None,overwrite_input=False,interpolation=‘liner’,keepdims=False)

参数说明:- a:array,用来计算分位数的对象,可以是多维数组

​ q:介于0-100的float,用来计算是几分位的参数,如四分之一位就是25,如果要计算两个位置的数就是[25,75]

​ axis:坐标轴方向,一维的不需要考虑这个参数,多维的用这个调整计算的维度方向,取值范围0/1

1
2
3
4
5
6
7
#.  求百分位数 在NumPy中,使用percentile()和nanpercentile()
r = np.random.randint(1, 20, [4, 5])
print(r)
# print(np.percentile(r,[25,50]))#四分之一位
# print(np.percentile(r,50))#相当于 中位数
# print(np.percentile(r,50,axis=0))#相当于 中位数 0轴
print(np.percentile(r,50,axis=1))#相当于 中位数 1轴

运行效果

1
2
3
4
5
6
7
8
9
10
11
12
13
#原数组
[[13 10 4 7 9]
[15 16 2 1 12]
[14 17 14 11 7]
[13 11 2 11 11]]
#四分之一位
[6. 9.]
#相当于 中位数
7.5
#0轴结果
[11. 10. 11.5 16.5 6.5]
#1轴结果
[ 9. 12. 14. 11.]

(四)求中位数

median()和nanmean()函数可以沿某轴axis方向计算数组中的中位数

1
2
3
4
#使用median函数求中位数
# print(np.median(r))
print(np.median(r,axis=0)) #按垂直方向
print(np.median(r,axis=1)) #按水平方向

(五)求和与加权平均值

sum()函数是沿某轴axis方向计算数组中相关元素之和,

average()函数是沿某轴axis方向计算数组中相关元素的加权平均值

1
2
3
4
5
6
7
8
9
10
a3 = np.arange(1,7).reshape(2,3)
#求和与加权平均值
#求和
sum1 = np.sum(a3) #结果21
sum2 = np.sum(a3,axis=0)#按垂直方向,结果[5 7 9]
sum3 = np.sum(a3,axis=1)#按水平方向,结果[ 6 15]
#权重值 计算权重值为1时的加权平均值
arr1 = np.average(a3) #结果3.5
arr2 = np.average(a3,axis=0)#按垂直方向,结果[2.5 3.5 4.5]
arr3 = np.average(a3,axis=1)#按水平方向,结果[2. 5.]

(六)算术平均数

算术平均数是所有元素的总和除以元素的数量

mean()和nanmean()函数可以计算数组或者轴方向的算术平均数

1
2
3
4
5
6
#算数平均数
arr1 = np.mean(a3)#结果3.5
arr2 = np.mean(a3,axis=0)#按垂直方向,结果[2.5 3.5 4.5]
arr3 = np.mean(a3,axis=1)#按水平方向,结果[2. 5.]


(七)标准差

标准差定义是总体各单位标准值与其平均数离差平方的算术平均数的平方根

作用:反映组内个体间的离散程度

1
2
3
4
#标准差
arr1 = np.std(a3) #结果1.707825127659933
arr2 = np.std(a3,axis=0)#按垂直方向,结果[1.5 1.5 1.5]
arr3 = np.std(a3,axis=1)#按水平方向,结果[0.81649658 0.81649658]

(八)方差

方差是元素与元素的平均数差的平方的平均数mean(abs(x - x.mean())**2)。

1
2
3
4
#方差
arr1 = np.var(a3) #结果2.9166666666666665
arr2 = np.var(a3,axis=0)#按垂直方向,结果[2.25 2.25 2.25]
arr3 = np.var(a3,axis=1)#按水平方向,结果[0.66666667 0.66666667]

三.NumPy 的排序函数

NumPy的排序方式主要分为直接排序和间接排序两种

(一) sort()函数

sort()函数作用是返回输入数组的排序副本

语法:sort(数组,轴,排序种类,排序字段)

1
2
3
4
5
6
7
8
9
10
#排序
a4 = np.array([[2,1,5],[3,6,4]])
arr1 = np.sort(a4) #结果[[1 2 5] [3 4 6]]
arr2 = np.sort(a4,axis=0)#按垂直方向,结果[[2 1 4] [3 6 5]]
arr3 = np.sort(a4,axis=1)#按水平方向,结果[[1 2 5] [3 4 6]]

#设置排序字段
dt = np.dtype( [ ('name',str,10),('age',int)])
arr = np.array([("liufei", 40), ("wangshidou", 18), ("fengzibo", 55)],dtype=dt)
# print(np.sort(arr,order='name'))

(二) argsort()函数

是对输入数组沿着给定轴执行间接排序,并根据指定排序类型返回数据的索引数组。

1
2
#argsort()函数  给定轴执行间接排序
arr1 = np.argsort(a) #返回索引数组

(三)lexsort()函数

使用键序列执行间接排序

1
2
3
4
5
6
7
# lexsort()函数  使用键序列执行间接排序
key = ('sno','name','age')
value = ('1','22','18')
lexsort = np.lexsort((key, value))
print(lexsort) #返回索引数组
for i in lexsort:
print(key[i]+","+value[i]) #sno,1 age,18 name,22

四.NumPy 的去重与重复函数

(一)unique()函数

返回输入数组中所有不同的值(即去重后的值),并且按照从小到大的顺序排列

语法:unique(数组,index返回去重后索引数组,inverse获取重构原数组索引,count重复数量)

1
2
3
4
5
6
7
#NumPy 的去重与重复函数
#unique()函数 unique(数组,index返回去重后索引数组,inverse获取重构原数组索引,count重复数量)
a2 = np.array([ [2,5,5,1],[8,4,6,8] ])
unique = np.unique(a2)
unique2 = np.unique(a2,return_index=True) #(array([1, 2, 4, 5, 6, 8]), array([3, 0, 5, 1, 6, 4], dtype=int64))
unique3,index = np.unique(a2,return_inverse=True) #[1 3 3 0 5 2 4 5]
unique4 = np.unique(a2,return_counts=True) #(array([1, 2, 4, 5, 6, 8]), array([1, 1, 1, 2, 1, 2], dtype=int64))

(二)tile()函数

将一个已有的数组重复一定的次数。

语法:tile(数组, 重复次数)

1
2
3
4
#tile()函数  tile(数组, 重复次数)
print(np.tile('a',3))#结果[ 'a' ,'a','a']
a3 = np.array([ 1,2 ])
print(np.tile(a3,(3,2)))#三行2列

(三)repeat()函数

指定需求重复的数组元素,沿着哪个轴进行重复多少次

语法:repeat(数组,重复次数,轴)

1
2
3
4
5
6
7
8
#repeat()    repeat(数组,重复次数,轴)
a3 = np.array([ 1,2 ])
print(np.repeat('a',3)) #结果[ 'a' ,'a','a']
print(np.repeat(a3,3)) #每个元素重复三遍 结果:[ 1 1 1 2 2 2]
print(np.repeat(a3,(3,2))) #第一个元素重复3次, 第二个元素重复2次 结果:[ 1 1 1 2 2]
a4 = np.array([ [1,2],[4,6] ])
arr1 = np.repeat(a4, 3,axis=0) #结果:[ [1,2],[1,2],[1,2], [4,6] ,[4,6] ,[4,6] ]
arr2 = np.repeat(a4, 3,axis=1) #结果:[[111222],[444666] ]

五.NumPy的搜索和计数函数

(一)argmin()、nanargmin()、argmax()函数

argmin()和argmax()函数作用是沿指定轴返回最小和最大元素的索引。nanargmin()函数作用是沿指定轴返回忽略了NaN的最小值的索引。

1
2
3
4
5
argmax()
a4 = np.array([ [2,5,5,1],[8,4,6,0] ])
print(np.argmax(a4))#最大值索引 4
print(np.argmax(a4,axis=0))#最大值索引 [1 0 1 1]
print(np.argmax(a4,axis=1))#最大值索引 [1 0 ]

(二)nonzero()函数

返回输入数组中非零元素的索引。

1
2
#nonzero() 非零索引数组
print(np.nonzero(a4)) #结果[0,1,2,3],[0,1,2,3]

(三)where()函数

返回输入数组中满足给定条件x的元素的索引或者是当给定的条件x为True时,返回y数据,否则返回z数据。

语法:where(条件,满足条件返回,不满足条件的返回)

1
2
3
#where(条件)
a5 = np.array([2,3,1,8,4,6 ])
print(np.where(a5 > 5))

(四)extract()函数

返回满足任何条件的元素。

语法:extract(表达式,数组)

1
2
3
4
#extract()  extract(表达式,数组)
a5 = np.array([2,3,0,8,4,6 ])
e = np.mod(a5,2) == 0
print(np.extract(e,a5))

(五)count_nonzero()计数函数

可以统计NumPy数组中非0元素的个数。

1
2
#非零次数
print(np.count_nonzero(a5))