python進階之資料分析與展示(三)
阿新 • • 發佈:2018-12-08
資料分析之表示
資料存取與函式
資料的CSV檔案存取
- CSV (Comma‐Separated Value, 逗號分隔值)
- CSV是一種常見的檔案格式,用來儲存批量資料。
- np.savetxt(frame, array, fmt=’%.18e’, delimiter=None)
- frame:檔案、字串或產生器,可以是.gz或.bz2的壓縮檔案。
- array:存入檔案的陣列。
- fmt:寫入檔案的格式,例如:%d,%.2f,%.18e。
- delimiter:分割字串,預設是任何空格。
In [1]: import numpy as np In [2]: a = np.arange(100).reshape(5, 20) In [3]: np.savetxt('a.csv', a, fmt = '%d', delimiter = ',') In [4]: np.savetxt('a.csv', a, fmt = '%.1f', delimiter = ',')
- np.loadtxt(frame, dtype=np.float, delimiter=None, unpack=False)
- frame:檔案、字串或產生器,可以是.gz或.bz2的壓縮檔案。
- dtype:資料型別,可選。
- delimiter:分割字串,預設是任何空格。
- unpack:如果True,讀入屬性將分別寫入不同變數。
In [5]: b = np.loadtxt('a.csv', delimiter = ',') In [6]: b Out[6]: 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., 24., 25., 26., 27., 28., 29., 30., 31., 32., 33., 34., 35., 36., 37., 38., 39.], [ 40., 41., 42., 43., 44., 45., 46., 47., 48., 49., 50., 51., 52., 53., 54., 55., 56., 57., 58., 59.], [ 60., 61., 62., 63., 64., 65., 66., 67., 68., 69., 70., 71., 72., 73., 74., 75., 76., 77., 78., 79.], [ 80., 81., 82., 83., 84., 85., 86., 87., 88., 89., 90., 91., 92., 93., 94., 95., 96., 97., 98., 99.]]) In [7]: b = np.loadtxt('a.csv', dtype = np.int, delimiter = ',') In [8]: b Out[8]: 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, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39], [40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59], [60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79], [80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99]])
- CSV檔案的侷限性
- CSV只能有效儲存一維和二維陣列。
- np.savetxt() np.loadtxt()只能有效存取一維和二維陣列。
多維資料的存取
-
a.tofile(frame, sep = ‘’, format = ‘%s’)
- frame:檔案、字串。
- sep:資料分割字串,如果是空串,寫入檔案為二進位制。
- format:寫入資料的格式。
-
np.fromfile(frame, dtype = float, count = ‐1, sep = ‘’)
-
frame : 檔案、字串。
-
dtype : 讀取的資料型別。
-
count : 讀入元素個數, ‐1表示讀入整個檔案。
-
sep : 資料分割字串,如果是空串,寫入檔案為二進位制。
In [1]: import numpy as np In [2]: a = np.arange(100).reshape((5, 10, 2)) In [3]: a.tofile("b.dat", sep = ',', format = '%d') In [4]: c = np.fromfile("b.dat", dtype = np.int, sep = ',') In [5]: c 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, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99]) In [6]: d = np.arange(100).reshape((5, 10, 2)) In [7]: d.tofile("e.dat", format = '%d') In [8]: f = np.fromfile("e.dat", dtype = np.int).reshape((5, 10, 2)) In [9]: f Out[9]: 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], [24, 25], [26, 27], [28, 29], [30, 31], [32, 33], [34, 35], [36, 37], [38, 39]], [[40, 41], [42, 43], [44, 45], [46, 47], [48, 49], [50, 51], [52, 53], [54, 55], [56, 57], [58, 59]], [[60, 61], [62, 63], [64, 65], [66, 67], [68, 69], [70, 71], [72, 73], [74, 75], [76, 77], [78, 79]], [[80, 81], [82, 83], [84, 85], [86, 87], [88, 89], [90, 91], [92, 93], [94, 95], [96, 97], [98, 99]]])
-
-
該方法需要讀取時知道存入檔案時陣列的維度和元素型別,a.tofile()和np.fromfile()需要配合使用,可以通過元資料檔案來儲存額外資訊。
-
numpy的便捷檔案存取
- np.save(fname, array)或np.savez(fname, array)
- fname:檔名,以.npy為副檔名,壓縮副檔名為.npz。
- array : 陣列變數。
- np.load(fname)
- fname:檔名,以.npy為副檔名,壓縮副檔名為.npz。
In [1]: import numpy as np In [2]: a = np.arange(100).reshape((5, 10, 2)) In [3]: np.save("a.npy", a) In [4]: b = np.load("a.npy") In [5]: 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], [24, 25], [26, 27], [28, 29], [30, 31], [32, 33], [34, 35], [36, 37], [38, 39]], [[40, 41], [42, 43], [44, 45], [46, 47], [48, 49], [50, 51], [52, 53], [54, 55], [56, 57], [58, 59]], [[60, 61], [62, 63], [64, 65], [66, 67], [68, 69], [70, 71], [72, 73], [74, 75], [76, 77], [78, 79]], [[80, 81], [82, 83], [84, 85], [86, 87], [88, 89], [90, 91], [92, 93], [94, 95], [96, 97], [98, 99]]])
- np.save(fname, array)或np.savez(fname, array)
numpy的隨機數函式子庫
-
NumPy的random子庫
- np.random.*。
- np.random.rand()。
- np.random.randn()。
- np.random.randint()。
-
np.random的隨機數函式
-
- 根據 建立隨機數陣列,浮點數,[0, 1),均勻分佈。
-
- 根據 建立隨機數陣列,標準正態分佈。
-
- 根據shape建立隨機整數或整數陣列,範圍是[low, high)。
-
- 隨機數種子,s是給定的種子值。
In [1]: import numpy as np In [2]: a = np.random.rand(3, 4, 5) In [3]: a Out[3]: array([[[ 0.83217382, 0.61118163, 0.30590278, 0.71116985, 0.17603919], [ 0.81172826, 0.48699483, 0.81460026, 0.623493 , 0.55107553], [ 0.86620657, 0.90390364, 0.81578716, 0.40891691, 0.2326408 ], [ 0.68340764, 0.63524826, 0.83587159, 0.19651474, 0.40335556]], [[ 0.08825054, 0.7536702 , 0.20601117, 0.74694086, 0.50562464], [ 0.40090569, 0.55872767, 0.8516932 , 0.6771278 , 0.17050715], [ 0.2302661 , 0.40845969, 0.7862477 , 0.58725055, 0.60185095], [ 0.65965904, 0.53130834, 0.07635645, 0.12635217, 0.29800591]], [[ 0.83050967, 0.91737354, 0.58201733, 0.34622195, 0.09050391], [ 0.35995164, 0.67825314, 0.4664572 , 0.81583095, 0.45641495], [ 0.87039701, 0.19466886, 0.99467247, 0.90765088, 0.14004337], [ 0.61259295, 0.3306319 , 0.92665368, 0.88046747, 0.91534592]]]) In [4]: sn = np.random.randn(3, 4, 5) In [5]: sn Out[5]: array([[[ 1.19890639, -1.04116259, 0.86310116, -0.44739765, 1.69247186], [-0.00500273, -1.72542962, -1.85303537, 0.32333834, 0.14319963], [-0.34740334, 1.13620253, -0.80952734, 0.5312918 , -0.40971214], [-0.16907081, 0.64456188, 0.68710157, 0.65388462, -1.67621268]], [[ 0.03925995, -2.42998597, 0.51701801, -0.33539791, -0.0650079 ], [-0.64138021, 0.63553016, 1.32243291, -1.22898913, 1.11420398], [ 0.55977458, 1.31880826, -1.90351377, 0.17989029, 0.82177797], [ 0.439646 , 0.70095378, -1.13840963, -0.75624264, -0.44955757]], [[ 0.91002957, 0.6574978 , 0.17688196, 0.12094879, 2.6644552 ], [ 2.07175029, 1.67643254, -0.55679737, 0.40536107, 1.5346217 ], [-0.27773992, -1.19676653, 0.71463593, 0.66457126, 0.14682141], [ 0.72601705, 1.4557889 , -1.60036546, 0.87030802, -0.82342311]]]) In [6]: b = np.random.randint(100, 200, (3, 4)) In [7]: b Out[7]: array([[171, 145, 171, 120], [191, 140, 162, 148], [128, 187, 191, 162]]) In [8]: np.random.seed(10) In [9]: np.random.randint(100, 200, (3, 4)) Out[9]: array([[109, 115, 164, 128], [189, 193, 129, 108], [173, 100, 140, 136]]) In [10]: np.random.seed(10) In [11]: np.random.randint(100, 200, (3, 4)) Out[11]: array([[109, 115, 164, 128], [189, 193, 129, 108], [173, 100, 140, 136]])
-
- 根據陣列a的第1軸進行隨機排列,改變陣列x。
-
- 根據陣列a的第1軸產生一個新的亂序陣列,不改變陣列x。
-
- 從一維陣列a中以概率p抽取元素,形成size形狀新陣列,replace表示是否可以重用元素,預設為False。
In [1]: import numpy as np In [2]: a = np.random.randint(100, 200, (3, 4)) In [3]: a Out[3]: array([[141, 109, 136, 153], [115, 118, 192, 152], [169, 143, 169, 126]]) In [4]: np.random.shuffle(a) # 陣列a發生了改變 In [5]: a Out[5]: array([[115, 118, 192, 152], [169, 143, 169, 126], [141, 109, 136, 153]]) In [6]: np.random.shuffle(a) In [7]: a Out[7]: array([[141, 109, 136, 153], [169, 143, 169, 126], [115, 118, 192, 152]]) In [8]: b = np.random.randint(100, 200, (3, 4)) In [9]: b Out[9]: array([[136, 197, 152, 165], [195, 154, 132, 155], [127, 121, 123, 161]]) In [10]: np.random.permutation(b) # 陣列b沒有被改變 Out[10]: array([[127, 121, 123, 161], [195, 154, 132, 155], [136, 197, 152, 165]]) In [11]: b Out[11]: array([[136, 197, 152, 165], [195, 154, 132, 155], [127, 121, 123, 161]]) In [12]: c = np.random.randint(100, 200, (8,)) In [13]: c Out[13]: array([195, 112, 130, 169, 156, 180, 102, 130]) In [14]: np.random.choice(c, (3, 2)) Out[14]: array([[102, 102], [180, 130], [130, 130]]) In [15]: np.random.choice(c, (3, 2), replace = False) Out[15]: array([[180, 112], [130, 130], [156, 169]]) In [16]: np.random.choice(c, (3, 2), p = c / np.sum(c)) Out[16]: array([[130, 130], [130, 130], [130, 169]])
-
- 產生具有均勻分佈的陣列,low起始值,high結束值,size形狀。
-
- 產生具有正態分佈的陣列,loc均值,scale標準差,size形狀。
-
- 產生具有泊松分佈的陣列,lam隨機事件發生率,size形狀。
In [1]: import numpy as np In [2]: u = np.random.uniform(0, 10, (3, 4)) In [3]: u Out[3]: array([[ 5.77047246, 1.01256917, 1.95423089, 9.20612219], [ 2.74586998, 3.40639646, 8.98460191, 4.54858063], [ 7.79810175, 3.70017557, 0.29809813, 0.99915164]]) In [4]: n = np.random.normal(10, 5, (3, 4)) In [5]: n Out[5]: array([[ 3.29396378, 23.49129387, 12.98561076, 18.09697008], [ 5.62780735, 10.50709279, 7.99811177, 2.961821 ], [ 15.52654509, 7.95058117, 11.39385202, 12.41859651]])
-
numpy的統計函式
-
NumPy直接提供的統計類函式
- np.*。
- np.std()。
- np.var()。
- np.average()。
-
NumPy的統計函式
-
sum(a, axis = None)
- 根據給定軸axis計算陣列a相關元素之和,axis整數或元組。
-
mean(a, axis = None)
- 根據給定軸axis計算陣列a相關元素的期望,axis整數或元組。
-
average(a, axis = None, weights = None)
- 根據給定軸axis計算陣列a相關元素的加權平均值。
-
std(a, axis = None)
- 根據給定軸axis計算陣列a相關元素的標準差。
-
var(a, axis = None)
- 根據給定軸axis計算陣列a相關元素的方差。
-
axis = None是統計函式的標配引數。
In [1]: import numpy as np In [2]: a = np.arange(15).reshape(3, 5) In [3]: a Out[3]: array([[ 0, 1, 2, 3, 4], [ 5, 6, 7, 8, 9], [10, 11, 12, 13, 14]]) In [4]: np.sum(a) Out[4]: 105 In [5]: np.mean(a, axis = 1) Out[5]: array([ 2., 7., 12.]) In [6]: np.mean(a, axis = 0) Out[6]: array([ 5., 6., 7., 8., 9.]) In [7]: np.average(a, axis = 0, weights = [10, 5, 1]) Out[7]: array([ 2.1875, 3.1875, 4.1875, 5.1875, 6.1875]) In [8]: np.std(a) Out[8]: 4.3204937989385739 In [9]: np.var(a) Out[9]: 18.666666666666668
-
min(a),max(a)
- 計算陣列a中元素的最小值、最大值。
-
argmin(a),argmax(a)
- 計算陣列a中元素最小值、最大值的降一維後下標。
-
unravel_index(index, shape)
- 根據shape將一維下標index轉換成多維下標。
-
ptp(a)
- 計算陣列a中元素最大值與最小值的差。
-
median(a)
- 計算陣列a中元素的中位數(中值)。
In [1]: import numpy as np In [2]: b = np.arange(15, 0, -1).reshape(3, 5) In [3]: b Out[3]: array([[15, 14, 13, 12, 11], [10, 9, 8, 7, 6], [ 5, 4, 3, 2, 1]]) In [4]: np.max(b) Out[4]: 15 In [5]: np.argmax(b) # 扁平化後的下標 Out[5]: 0 In [6]: np.unravel_index(np.argmax(b), b.shape) # 重塑成多維下標 Out[6]: (0, 0) In [7]: np.ptp(b) Out[7]: 14 In [8]: np.median(b) Out[8]: 8.0
-
numpy的梯度函式
- np.gradient(f)
-
計算陣列f中元素的梯度,當f為多維時,返回每個維度梯度。
-
梯度:連續值之間的變化率,即斜率。
-
XY座標軸連續三個X座標對應的Y軸值:a, b, c,其中b的梯度是:(c‐a)/2。
In [1]: import numpy as np In [2]: a = np.random.randint(0, 20, (5)) In [3]: a Out[3]: array([ 2, 4, 11, 12, 17]) In [4]: np.gradient(a) Out[4]: array([ 2. , 4.5, 4. , 3. , 5. ]) In [5]: b = np.random.randint(0, 20, (5)) In [6]: b Out[6]: array([ 2, 7, 7, 18, 15]) In [7]: np.gradient(b) Out[7]: array([ 5. , 2.5, 5.5, 4. , -3. ]) # 兩種情況的計算:存在兩側值比如2.5 = (7‐2)/2和只有一側值比如-3 = (15‐18)/1 In [8]: c = np.random.randint(0, 50, (3, 5)) In [9]: c Out[9]: array([[41, 17, 33, 14, 20], [ 0, 17, 37, 19, 6], [20, 1, 11, 49, 20]]) In [10]: np.gradient(c) Out[10]: [array([[-41. , 0. , 4. , 5. , -14. ], [-10.5, -8. , -11. , 17.5, 0. ], [ 20. , -16. , -26. , 30. , 14. ]]), # 最外層維度的梯度 array([[-24. , -4. , -1.5, -6.5, 6. ], [ 17. , 18.5, 1. , -15.5, -13. ], [-19. , -4.5, 24. , 4.5, -29. ]])] # 第二層維度的梯度
-