本教程是NumPy库的介绍与使用的第二部分。 第一部分请参考:https://blog.csdn.net/qq_45152498/article/details/107051486?utm_source=app
(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()只能有效存取一维和二维数组。
(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为扩展名,压缩扩展名为.npzarray:数组变量 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]]])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]])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.666666666666668NumPy的统计函数(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梯度:连续值之间的变化率,即斜率。 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数据分析与展示 如有错误或者不足之处,欢迎大家留言指正!