本教程是NumPy库的介绍与使用的第二部分。
第一部分请参考:https://blog.csdn.net/qq_45152498/article/details/107051486?utm_source=app
NumPy数据存取与函数
1.数据的CSV文件存取
(1)CSV文件
CSV (Comma-Separated Value,逗号分隔值)
CSV是一种常见的文件格式,用来存储批量数据。
(2)如何将数组写入CSV文件?
np.savetxt(frame, array, fmt='%.18e', delimiter=None) #介绍部分参数
- frame:文件、字符串或产生器,可以是.gz或.bz2的压缩文件。
- array:存入文件的数组。
- fmt:写入文件的格式,例如:%d、%.2f 、%.18e。
- delimiter:分割字符串,默认是任何空格。
示例
import numpy as np
a = np.arange(18).reshape(2,9)
a
Out[4]:
array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8],
[ 9, 10, 11, 12, 13, 14, 15, 16, 17]])
np.savetxt('a.csv', a, fmt='%d', delimiter=',') #将数组保存成CSV文件
fo = open('a.csv',"r") #打开a.csv文件
for line in fo:
print(line) #在屏幕上显示文件内容
0,1,2,3,4,5,6,7,8
9,10,11,12,13,14,15,16,17
fo.close() #关闭文件
(3)如何读取CSV文件到数组?
np.loadtxt(frame, dtype=np.float, delimiter=None, unpack=FaIse) #介绍部分参数
- frame:文件、字符串或产生器,可以是.gz或.bz2的压缩文件。
- dtype:数据类型,可选。
- delimiter:分割字符串,默认是任何空格。
- unpack:如果True,读入属性将分别写入不同变量。
示例
b = np.loadtxt('a.csv', delimiter=',')
b
Out[18]:
array([[ 0., 1., 2., 3., 4., 5., 6., 7., 8.],
[ 9., 10., 11., 12., 13., 14., 15., 16., 17.]])
b = np.loadtxt('a.csv', dtype=np.int, delimiter=',') #改变数据类型
b
Out[20]:
array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8],
[ 9, 10, 11, 12, 13, 14, 15, 16, 17]])
c = np.loadtxt('a.csv', dtype=np.int, delimiter=',', unpack=True)
c
Out[32]:
array([[ 0, 9],
[ 1, 10],
[ 2, 11],
[ 3, 12],
[ 4, 13],
[ 5, 14],
[ 6, 15],
[ 7, 16],
[ 8, 17]])
q,w,e,r,t,y,u,i,o = np.loadtxt('a.csv', dtype=np.int, delimiter=',', unpack=True) #读入到不同数组
q
Out[34]: array([0, 9])
o
Out[35]: array([ 8, 17])
(4)CSV文件的局限性
CSV只能有效存储一维和二维数组,也就是说np.savetxt()和np.loadtxt()只能有效存取一维和二维数组。
2.多维数据的存取
(1)任意维度数据存取
a.tofile(frame, sep=", format='%s')
- frame:文件、字符串。
- sep:数据分割字符串,如果是空串,写入文件为二进制。
- format:写入数据的格式。
示例
a = np.arange(24).reshape(2,3,4)
a
Out[36]:
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]],
[[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23]]])
a.tofile("b.dat", sep=',', format='%d')
f = open("b.dat", 'r')
for line in f:
print(line) #显示文件内容
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23
f.close()
(2)读取文件还原数据
np.fromfile(frame, dtype=float, count=-1, sep=")
-
frame:文件、字符串。
-
dtype:读取的数据类型。
-
count:读入元素个数,-1表示读入整个文件。
-
sep:数据分割字符串,如果是空串,写入文件为二进制。
读取文本文件
a = np.arange(24).reshape(2,3,4)
a.tofile("b.dat", sep=',', format='%d') #生成文本文件,维度信息丢失
c = np.fromfile("b.dat", dtype=np.int, sep=',')
c
Out[22]:
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23])
c = np.fromfile("b.dat", dtype=np.int, sep=',').reshape(2,3,4) #变换数组维度
c
Out[24]:
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]],
[[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23]]])
读取二进制文件
a = np.arange(24).reshape(2,3,4)
a.tofile("b.dat", format='%d') #生成二进制文件,维度信息丢失
c = np.fromfile("b.dat", dtype=np.int)
c
Out[33]:
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23])
c = np.fromfile("b.dat", dtype=np.int).reshape(2,3,4) #变换数组维度
c
Out[37]:
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]],
[[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23]]])
注意:
①该方法读取时需要知道存入文件时数组的维度和元素类型;②a.tofile()和np.fromfile()可以配合使用达到数据缓存的目的;③可以通过元数据文件来存储额外信息。
(3)NumPy的便捷文件存取
np.save(fname, array) 或 np.savez(fname, array)
- fname:文件名,以.npy为扩展名,压缩扩展名为.npz
- array:数组变量
np.load(fname)
fname:文件名,以.npy为扩展名,压缩扩展名为.npz
示例
import numpy as np
a = np.arange(24).reshape(2,3,4)
np.save("a.npy",a) #这个文件需要打开电脑的隐藏项目才可以看到
b = np.load("a.npy")
b
Out[5]:
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]],
[[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23]]])
3.NumPy的随机数函数
NumPy的random子库
np.random.*
np.random的随机数函数(1)
import numpy as np
a = np.random.rand(2,3,4)
a
Out[3]:
array([[[0.36471364, 0.34718866, 0.36064756, 0.78410878],
[0.12830901, 0.83901722, 0.34417573, 0.51421197],
[0.58124066, 0.99361486, 0.53174879, 0.5647538 ]],
[[0.08715647, 0.31419565, 0.43201921, 0.29539433],
[0.83393732, 0.53002474, 0.11969182, 0.32529073],
[0.47897925, 0.48837353, 0.05193301, 0.08979494]]])
sn = np.random.randn(2,3,4)
sn
Out[5]:
array([[[ 1.18758174, -1.20623701, -0.33194348, 1.10717503],
[ 0.55046098, -0.37949067, -0.39361895, 1.61583474],
[ 0.08805425, 0.08435202, -0.04118038, -0.71567655]],
[[ 1.92751269, 0.5885066 , -0.48169842, 2.16505115],
[ 0.19945011, 0.13902858, 1.42570701, -0.26348193],
[-0.86675236, 1.19701332, 0.28535783, 1.75732157]]])
b = np.random.randint(100,200,(3,4))
b
Out[7]:
array([[192, 102, 187, 102],
[164, 148, 195, 132],
[112, 117, 199, 155]])
np.random.seed(10) #更改随机数种子
np.random.randint(100,200,(3,4))
Out[10]:
array([[109, 115, 164, 128],
[189, 193, 129, 108],
[173, 100, 140, 136]])
np.random.seed(10) #种子不变,数组不变
np.random.randint(100,200,(3,4))
Out[12]:
array([[109, 115, 164, 128],
[189, 193, 129, 108],
[173, 100, 140, 136]])
np.random的随机数函数(2)
a = np.random.randint(100,200,(3,4))
a
Out[15]:
array([[116, 111, 154, 188],
[162, 133, 172, 178],
[149, 151, 154, 177]])
np.random.shuffle(a)
a #a发生了变化
Out[17]:
array([[116, 111, 154, 188],
[149, 151, 154, 177],
[162, 133, 172, 178]])
a = np.random.randint(100,200,(3,4))
a
Out[23]:
array([[177, 122, 123, 194],
[111, 128, 174, 188],
[109, 115, 118, 180]])
np.random.permutation(a)
Out[25]:
array([[109, 115, 118, 180],
[111, 128, 174, 188],
[177, 122, 123, 194]])
a #a没有变化
Out[26]:
array([[177, 122, 123, 194],
[111, 128, 174, 188],
[109, 115, 118, 180]])
b = np.random.randint(100,200,8)
b
Out[28]: array([117, 146, 107, 175, 128, 133, 184, 196])
np.random.choice(b,(3,2)) #可以重复选取元素
Out[29]:
array([[117, 128],
[133, 128],
[196, 117]])
np.random.choice(b,(3,2),replace=False) #不可以重复选取元素
Out[30]:
array([[133, 175],
[146, 196],
[184, 128]])
np.random.choice(b,(3,2),p=b/np.sum(b)) #设定数值大的出现概率大
Out[32]:
array([[196, 107],
[146, 196],
[133, 133]])
np.random的随机数函数(3)
u = np.random.uniform(0,10,(3,4))
u
Out[34]:
array([[4.36353698, 3.56250327, 5.87130925, 1.49471337],
[1.71238598, 3.97164523, 6.37951564, 3.72519952],
[0.02406761, 5.48816356, 1.26971841, 0.79792681]])
n = np.random.normal(10,5,(3,4))
n
Out[36]:
array([[13.57941572, 4.07115727, 6.81836048, 6.94593078],
[ 3.40304302, 7.19135792, 11.02692287, 5.23319662],
[11.60758976, 2.39530663, -0.80726459, 11.72656647]])
m = np.random.poisson(0.3,(3,4))
m
Out[38]:
array([[0, 1, 0, 0],
[0, 0, 0, 0],
[0, 0, 1, 0]])
4.NumPy的统计函数
NumPy直接提供的统计类函数
np.*
NumPy的统计函数(1)
import numpy as np
a = np.arange(15).reshape(3,5)
a
Out[3]:
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
np.sum(a)
Out[4]: 105
np.mean(a,axis=1) #内层元素
Out[5]: array([ 2., 7., 12.])
np.mean(a,axis=0) #最外层元素
Out[6]: array([5., 6., 7., 8., 9.])
np.average(a,axis=0,weights=[10,5,1])
Out[8]: array([2.1875, 3.1875, 4.1875, 5.1875, 6.1875])
np.std(a)
Out[9]: 4.320493798938574
np.var(a)
Out[10]: 18.666666666666668
NumPy的统计函数(2)
b = np.arange(15,0,-1).reshape(3,5)
b
Out[12]:
array([[15, 14, 13, 12, 11],
[10, 9, 8, 7, 6],
[ 5, 4, 3, 2, 1]])
np.max(b)
Out[13]: 15
np.argmax(b) #扁平化(变成一维)后的下标
Out[14]: 0
np.unravel_index(np.argmax(b),b.shape) #重塑成多维下标
Out[15]: (0, 0)
np.ptp(b)
Out[16]: 14
np.median(b)
Out[17]: 8.0
5.NumPy的梯度函数
梯度:连续值之间的变化率,即斜率。
XY坐标轴连续三个x坐标对应的Y轴值:a,b,c
其中,b的梯度是: (c-a)/2
a = np.random.randint(0,20,5)
a
Out[19]: array([13, 18, 17, 12, 6])
np.gradient(a)
Out[20]: array([ 5. , 2. , -3. , -5.5, -6. ])
#2=(17-13)/2 -6=(6-12)/1
b = np.random.randint(0,50,(3,5))
b
Out[22]:
array([[47, 19, 21, 7, 0],
[11, 23, 8, 17, 28],
[ 0, 25, 33, 16, 26]])
np.gradient(b)
Out[23]:
[array([[-36. , 4. , -13. , 10. , 28. ],
[-23.5, 3. , 6. , 4.5, 13. ],
[-11. , 2. , 25. , -1. , -2. ]]), #最外层维度的梯度
array([[-28. , -13. , -6. , -10.5, -7. ],
[ 12. , -1.5, -3. , 10. , 11. ],
[ 25. , 16.5, -4.5, -3.5, 10. ]])] #第二层维度的梯度
本文内容参考:
中国大学慕课北京理工大学嵩天老师所讲的Python数据分析与展示
如有错误或者不足之处,欢迎大家留言指正!