1. 程式人生 > >Numpy入門——Python資料分析mooc筆記

Numpy入門——Python資料分析mooc筆記

資料

一個數據,表達一個含義
一組資料,表達一個或多個含義

列表和陣列

列表:資料型別可以不同
陣列:資料型別相同

Python已有列表型別,為什麼需要一個數組物件(型別)?

  • 陣列物件可以去掉元素間運算所需的迴圈,使一維向量更像單個數據
  • 設定專門的陣列物件,經過優化,可以提升這類應用的運算速度
  • 陣列物件採用相同的資料型別,有助於節省運算和儲存空間

比較Python內建列表型別和陣列物件型別

計算A2+B3,其中A和B是一維陣列

  • Python內建列表型別

    def pySum():
        a = [0,1,2,3,4]
        b = [5,6,7,8
    ,9] c = [] for i in range(len(a)): c.append(a[i]**2+b[i]**3) return c print(pySum())
  • numpy陣列

    import numpy as np
    def npSum():
        a = np.array([0,1,2,3,4])
        b = np.array([5,6,7,8,9])
        c = a**2 + b**3
        return c
    print(npSum())

N維陣列物件:ndarray

np.array()生成一個ndarray陣列,輸出成[]

形式,元素由空格分隔
軸(axis): 儲存資料的維度;秩(rank):軸的數量

In [1]: import numpy as np

In [2]: a = np.array([[0,1,2,3],[4,5,6,7]])

In [3]: a
Out[3]:
array([[0, 1, 2, 3],
       [4, 5, 6, 7]])

In [4]: a.ndim
Out[4]: 2

In [5]: a.shape
Out[5]: (2, 4)

In [6]: a.size
Out[6]: 8

In [7]: a.dtype
Out[7]: dtype('int32')

In [8
]: a.itemsize Out[8]: 4 In [9]: b = np.array([[0,1,2,3,4],[5,6,7]]) # ndarray陣列可以由非同質物件構成 In [10]: b Out[10]: array([[0, 1, 2, 3, 4], [5, 6, 7]], dtype=object) # 非同質ndarray元素為物件型別 In [11]: b.ndim Out[11]: 1 In [12]: b.shape Out[12]: (2,) In [13]: b.size Out[13]: 2 # 非同質ndarray物件無法有效發揮NumPy優勢,儘量避免使用 In [14]: b.dtype Out[14]: dtype('O') In [15]: b.itemsize Out[15]: 8
屬性 說明
.ndim 秩,即軸的數量或維度的數量
.shape ndarray物件的尺度,對於矩陣,n行m列
.size ndarray物件元素的個數,相當於.shape中n*m的值
.dtype ndarray物件的元素型別(bool,intc,intp,int8,int16,int32,int64)
.itemsize ndarray物件中每個元素的大小,以位元組為單位

ndarray陣列的建立方法

  1. 從Python中的列表、元組等型別建立ndarray陣列
    x = np.array(list/tuple, dtype=np.float32)
    當np.array()不指定dtype時,NumPy將根據資料情況關聯一個dtype型別
  2. 使用NumPy中函式建立ndarray陣列,如:arange, ones, zeros等

    函式 說明
    np.arange(n) 類似range()函式,返回ndarray型別,元素從0到n‐1
    np.ones(shape) 根據shape生成一個全1陣列,shape是元組型別
    np.zeros(shape) 根據shape生成一個全0陣列,shape是元組型別
    np.full(shape,val) 根據shape生成一個數組,每個元素值都是val
    np.eye(n) 建立一個正方的n*n單位矩陣,對角線為1,其餘為0
    np.ones_like(a) 根據陣列a的形狀生成一個全1陣列
    np.zeros_like(a) 根據陣列a的形狀生成一個全0陣列
    np.full_like(a,val) 根據陣列a的形狀生成一個數組,每個元素值都是val
  3. 使用NumPy中其他函式建立ndarray陣列

    函式 說明
    np.linspace() 根據起止資料等間距地填充資料,形成陣列
    np.concatenate() 將兩個或多個數組合併成一個新的陣列
    In [2]: a = np.linspace(1,10,4)
    
    In [3]: a
    Out[3]: array([  1.,   4.,   7.,  10.])
    
    In [4]: b = np.linspace(1,10,4,endpoint=False)
    
    In [5]: b
    Out[5]: array([ 1.  ,  3.25,  5.5 ,  7.75])
    py
    In [6]: c = np.concatenate((a,b))
    
    In [7]: c
    Out[7]: array([  1.  ,   4.  ,   7.  ,  10.  ,   1.  ,   3.25,   5.5 ,   7.75])

ndarray陣列的變換

對於建立後的ndarray陣列,可以對其進行維度變換和元素型別變換
1. 維度變換

| 方法                   | 說明                           |
| -------------------- | ---------------------------- |
| `.reshape(shape)`    | 不改變陣列元素,返回一個shape形狀的陣列,原陣列不變 |
| `.resize(shape)`     | 與.reshape()功能一致,但修改原陣列       |
| `.swapaxes(ax1,ax2)` | 將陣列n個維度中兩個維度進行調換             |
| `.flatten()`         | 對陣列進行降維,返回摺疊後的一維陣列,原陣列不變     |

```shell
In [8]: d = np.ones((2,3,4),dtype=np.int32)

In [9]: d.reshape((3,8))
Out[9]:
array([[1, 1, 1, 1, 1, 1, 1, 1],
       [1, 1, 1, 1, 1, 1, 1, 1],
       [1, 1, 1, 1, 1, 1, 1, 1]])

In [10]: d
Out[10]:
array([[[1, 1, 1, 1],
        [1, 1, 1, 1],
        [1, 1, 1, 1]],

       [[1, 1, 1, 1],
        [1, 1, 1, 1],
        [1, 1, 1, 1]]])

In [11]: d.resize((3,8))

In [12]: d
Out[12]:
array([[1, 1, 1, 1, 1, 1, 1, 1],
       [1, 1, 1, 1, 1, 1, 1, 1],
       [1, 1, 1, 1, 1, 1, 1, 1]])

In [13]: d.flatten()
Out[13]:
array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1])

In [14]: d
Out[14]:
array([[1, 1, 1, 1, 1, 1, 1, 1],
       [1, 1, 1, 1, 1, 1, 1, 1],
       [1, 1, 1, 1, 1, 1, 1, 1]])
```
  1. 型別變換
    new_a = a.astype(new_type)
    astype()方法一定會建立新的陣列(原始資料的一個拷貝),即使兩個型別一致

    In [2]: e = np.ones((2,3,4),dtype=np.int)
    
    In [3]: e
    Out[3]:
    array([[[1, 1, 1, 1],
            [1, 1, 1, 1],
            [1, 1, 1, 1]],
    
           [[1, 1, 1, 1],
            [1, 1, 1, 1],
            [1, 1, 1, 1]]])
    
    In [4]: e.astype(np.float)
    Out[4]:
    array([[[ 1.,  1.,  1.,  1.],
            [ 1.,  1.,  1.,  1.],
            [ 1.,  1.,  1.,  1.]],
    
           [[ 1.,  1.,  1.,  1.],
            [ 1.,  1.,  1.,  1.],
            [ 1.,  1.,  1.,  1.]]])
  2. 陣列向列表的轉換
    ls = a.tolist()

    In [2]: a = np.full((2,3,4),25,dtype=np.int32)
    
    In [3]: a
    Out[3]:
    array([[[25, 25, 25, 25],
            [25, 25, 25, 25],
            [25, 25, 25, 25]],
    
           [[25, 25, 25, 25],
            [25, 25, 25, 25],
            [25, 25, 25, 25]]])
    
    In [4]: a.tolist()
    Out[4]:
    [[[25, 25, 25, 25], [25, 25, 25, 25], [25, 25, 25, 25]],
    [[25, 25, 25, 25], [25, 25, 25, 25], [25, 25, 25, 25]]]

ndarray陣列的操作

索引:獲取陣列中特定元素位置的過程
切片:獲取陣列元素子集的過程
- 一維陣列的索引和切片:與Python的列表類似
每個維度切片方法與一維陣列相同
每個維度可以使用步長跳躍切片

```
In [2]: a = np.array([9,8,7,6,5])

In [3]: a[2]
Out[3]: 7

In [4]: a[1:4:2]
Out[4]: array([8, 6])
```
  • 多維陣列的切片

    In [5]: b = np.arange(24).reshape((2,3,4))
    
    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]]])
    
    In [7]: b[1,2,3]
    Out[7]: 23
    
    In [8]: b[-1,-2,-3]
    Out[8]: 17

ndarray陣列的運算

  • 陣列與標量之間的運算作用於陣列的每一個元素
  • NumPy一元函式
    對ndarray中的資料執行元素級運算的函式
函式 說明
np.abs(x)np.fabs(x) 計算陣列各元素的絕對值
np.sqrt(x) 計算陣列各元素的平方根
np.square(x) 計算陣列各元素的平方
np.log(x)np.log10(x)np.log2(x) 計算陣列各元素的自然對數、10底對數和2底對數
np.ceil(x)np.floor(x) 計算陣列各元素的ceiling值 或 floor值
np.rint(x) 計算陣列各元素的四捨五入值
np.modf(x) 將陣列各元素的小數和整數部分以兩個獨立陣列形式返回
np.cos(x)np.cosh(x)
np.sin(x)np.sinh(x)
np.tan(x)np.tanh(x)
計算陣列各元素的普通型和雙曲型三角函式
np.exp(x) 計算陣列各元素的指數值
np.sign(x) 計算陣列各元素的符號值,1(+), 0, ‐1(‐)

- NumPy二元函式

| 函式                                       | 說明                     |
| ---------------------------------------- | ---------------------- |
| `+`、`‐`、`*`、`/`、`**`                     | 兩個陣列各元素進行對應運算          |
| `np.maximum(x,y)`、`np.fmax()`<br>`np.minimum(x,y)`、`np.fmin()` | 元素級的最大值/最小值計算          |
| `np.mod(x,y)`                            | 元素級的模運算                |
| `np.copysign(x,y)`                       | 將陣列y中各元素值的符號賦值給陣列x對應元素 |
| `>`、`<`、`>=`、`<=`、`==`、`!=`              | 算術比較,產生布爾型陣列           |