- Python廣告數據挖掘與分析實戰
- 楊游云 周健
- 1010字
- 2021-04-02 14:21:22
3.1.6 其他常用操作
除上述常用操作外,還有一些其他操作,這里簡單列舉幾種。
1.數組排序
盡管Python中內置了sort和sorted函數對列表進行排序,但NumPy的np.sort函數實際上效率更高。默認情況下,np.sort的排序算法是快速排序,其算法復雜度為NlogN,另外,也可以選擇歸并排序和堆排序。對于大多數應用場景,默認的快速排序已經足夠高效了。如果想在不修改原始輸入數組的基礎上返回一個排好序的數組,可以使用np.sort函數。
In [127]: array1 = np.random.randn(8) In [128]: array1 Out[128]: array([ 2.32922766e-03, -4.65499947e-01, -1.05467673e+00, -4.87072122e-01, 1.13967269e+00, -2.67169310e+00, -1.17234641e+00, -1.21430879e-01]) In [129]: np.sort(array1) Out[129]: array([-2.67169310e+00, -1.17234641e+00, -1.05467673e+00, -4.87072122e-01, -4.65499947e-01, -1.21430879e-01, 2.32922766e-03, 1.13967269e+00])
可以看到,如果不指定,np.sort函數默認是按升序排列的。另外,還可以通過設置axis參數對多維數組的行或列進行排序。參數axis=0、axis=1分別表示按行、按列進行排序。
In [130]: array2 = np.random.randint(0,10,size=(3,3)) In [131]: array2 Out[131]: array([[7, 9, 3], [0, 7, 6], [5, 0, 4]]) In [132]: np.sort(array2,axis=0) Out[132]: array([[0, 0, 3], [5, 7, 4], [7, 9, 6]]) In [133]: np.sort(array2,axis=1) Out[133]: array([[3, 7, 9], [0, 6, 7], [0, 4, 5]])
2.數組統計
前面介紹了部分常用的數組函數,其實數組中的數學統計方法在實際應用中也經常用到,它們表示對整個數組或某個軸進行數據統計計算,如表3-2所示。
表3-2 常用的數組函數

與排序類似,mean和sum這些函數同樣可以接收一個axis參數,用于對某個軸進行統計,若不加以指明,則默認對整個數組進行統計。
In [134]: array3 = np.array([[1,2,3],[4,5,6],[7,8,9]]) In [135]: array3 Out[135]: array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) In [136]: array3.sum() Out[136]: 45 In [137]: array3.sum(axis=0) Out[137]: array([12, 15, 18]) In [138]: array3.mean() Out[138]: 5.0 In [139]: array3.mean(axis=1) Out[139]: array([2., 5., 8.]) In [140]: array3.min() Out[140]: 1 In [141]: array3.max() Out[141]: 9
3.線性代數運算
NumPy中支持線性代數運算功能,可以輕松實現對數組或者矩陣的快速運算。dot函數就是常用于求數組或者矩陣乘法的典型函數,另外NumPy.linalg中也有一組標準的矩陣分解、矩陣求逆以及求行列式等函數。
In [142]: a = np.array([[1.5,2.5,3.5],[4.5,5.5,6.6]]) In [143]: b = np.array([[4.0,6.8],[-2.3,9.6],[5.2,6.1]]) In [144]: a.dot(b) Out[144]: array([[ 18.45, 55.55], [ 39.67, 123.66]])
這里的dot函數表示矩陣乘法,與前面介紹的矩陣相乘規則相同,即A*B,但與矩陣點乘(multiply)不同,需要注意區分。
通過inv函數求矩陣(方陣)的逆:
In [146]: from NumPy.linalg import inv In [147]: X = np.matrix(np.random.rand(3,3)) In [148]: X Out[148]: matrix([[0.24433453, 0.92087325, 0.7367185 ], [0.14273623, 0.29192359, 0.75203012], [0.77675993, 0.53315501, 0.51086317]]) In [149]: inv(X) Out[149]: matrix([[-0.84428363, -0.26036073, 1.60081706], [ 1.71403818, -1.50014299, -0.26349705], [-0.50511052, 1.96147735, -0.20155255]])
還有另外一種快速求矩陣的逆的方法,即通過.I實現。
In [150]: X.I Out[150]: matrix([[-0.84428363, -0.26036073, 1.60081706], [ 1.71403818, -1.50014299, -0.26349705], [-0.50511052, 1.96147735, -0.20155255]])
需要注意的是,只有在矩陣為方陣(行數和列數相等)的情況下,才可以求矩陣的逆。
4.隨機數生成
NumPy.random模塊對Python內置的random進行了補充,增加了一些用于快速生成多種概率分布的隨機數的函數。例如,我們可以通過normal來得到一個服從標準正態分布的樣本數組:
In [151]: samples = np.random.normal(size=(3,3)) In [152]: samples Out[152]: array([[ 0.42745142, 1.07576515, 0.77186596], [ 0.76190693, 0.31185696, -0.72752961], [ 0.06208286, -0.65498485, -0.15007811]])
可以通過rand生成服從均勻分布的樣本數組:
In [153]: samples1 = np.random.rand(4,4) In [154]: samples1 Out[154]: array([[0.21082897, 0.0266671, 0.23973794, 0.5355538 ], [0.7134466, 0.3593146, 0.97527854, 0.14084089], [0.3238133, 0.87598642, 0.14541845, 0.62839632], [0.21154816, 0.30865245, 0.33729369, 0.54159844]])
我們還可以通過randint得到從給定的上下限范圍內隨機選取整數的樣本數組等。
In [155]: samples3 = np.random.randint(0,10,size=(4,6)) In [156]: samples3 Out[156]: array([[9, 5, 0, 5, 4, 8], [9, 0, 4, 3, 1, 8], [4, 3, 0, 1, 3, 1], [5, 2, 9, 5, 0, 8]])
- 程序員修煉之道:從小工到專家
- Greenplum:從大數據戰略到實現
- 圖解機器學習算法
- Hadoop 3.x大數據開發實戰
- Remote Usability Testing
- Apache Kylin權威指南
- Expert Python Programming(Third Edition)
- Visual FoxPro數據庫技術基礎
- openGauss數據庫核心技術
- Filecoin原理與實現
- 數據庫原理與設計實驗教程(MySQL版)
- Google Cloud Platform for Architects
- 數據應用工程:方法論與實踐
- Arquillian Testing Guide
- ECharts數據可視化:入門、實戰與進階