官术网_书友最值得收藏!

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]])

主站蜘蛛池模板: 莱州市| 衡南县| 罗源县| 盘锦市| 大理市| 阜南县| 石柱| 光山县| 阿合奇县| 资兴市| 洱源县| 河津市| 全南县| 大足县| 寻甸| 芮城县| 高淳县| 孟州市| 灵台县| 手机| 民权县| 瑞金市| 孙吴县| 阳新县| 洪湖市| 武乡县| 正宁县| 盐源县| 南郑县| 邯郸市| 富蕴县| 鲜城| 惠来县| 三门县| 司法| 察雅县| 湘阴县| 湟源县| 铜鼓县| 台中市| 定远县|