使用NumPy、Numba的簡單使用(一)

  • 2019 年 10 月 5 日
  • 筆記

Numpy是python的一個三方庫,主要是用於計算的,數組的算數和邏輯運算。與線性代數有關的操作。

很多情況下,我們可以與SciPy和 Matplotlib(繪圖庫)一起使用。來替代MatLab,下面我來來看一下numpy庫的常見的一些操作。

#!/usr/bin/env python  # -*- coding: utf-8 -*-    import numpy as np    if __name__ == '__main__':      print(np.array([1, 2, 3]))

我們可以看到我們的輸出為[1,2,3],類型為<class 'numpy.ndarray'>,我們可以將一個列錶轉化為數組。這裡我也列出了一些最基本的用法

#!/usr/bin/env python  # -*- coding: utf-8 -*-    import numpy as np    if __name__ == '__main__':      a = np.array(['1', '2', '3'])      print(a.size)  # 數組的長度      print(a.shape)  # 數組的結構      print(a.ndim)  # 數組的維度      print(a.dtype)  # 內部元素類型

創建10行10列的數值為浮點1的矩陣

array_one = np.ones([10, 10])

快創建10行10列的數值為浮點0的矩陣

array_zero = np.zeros([10, 10])

從現有的數據創建數組

  • array(深拷貝)
  • asarray(淺拷貝)
#!/usr/bin/env python  # -*- coding: utf-8 -*-    import numpy as np    if __name__ == '__main__':      a = array_one = np.ones([10, 10])      b = np.asarray(a)      print(id(a))      print(id(b))      c = np.array(b)      print(id(c))

說完了這些,我們應該對於numpy有了初步的認識,我們到這裡知道了numpy…..原來是生成一個多維數組的玩意

我們再來深入的看一下numpy的內部資訊吧。

NumPy 最重要的一個特點是其 N 維數組對象 ndarray,它是一系列同類型數據的集合,以 0 下標為開始進行集合中元素的索引。

ndarray 對象是用於存放同類型元素的多維數組。

ndarray 中的每個元素在記憶體中都有相同存儲大小的區域。

ndarray 內部由以下內容組成:

  • 一個指向數據(記憶體或記憶體映射文件中的一塊數據)的指針。
  • 數據類型或 dtype,描述在數組中的固定大小值的格子。
  • 一個表示數組形狀(shape)的元組,表示各維度大小的元組。
  • 一個跨度元組(stride),其中的整數指的是為了前進到當前維度下一個元素需要"跨過"的位元組數

這裡我們提到的了跨度,跨度可以是負數,這樣會使數組在記憶體中後向移動,切片中 obj[::-1] 或 obj[:,::-1] 就是如此。注意這裡是位元組數,不是字元數。

創建一個 ndarray 只需調用 NumPy 的 array 函數即可,這裡我們要說一個重要的屬性,也是容易誤解的屬性->ndim,秩,即軸的數量或維度的數量,我們只記住他是維度的數量就ok了。

索引:

import numpy as np    if __name__ == '__main__':      a = np.arange(10)      print(a)      s = slice(2, 8, 2)  # 從索引 2 開始到索引 8 停止,間隔為2,是一個左閉右開區間      print(a[s])

切片:

#!/usr/bin/env python  # -*- coding: utf-8 -*-    import numpy as np    if __name__ == '__main__':      a = np.arange(10)      print(a)      print(a[2:8:2]) # 從索引 2 開始到索引 8 停止,間隔為 2,不包含8的一個左閉右開區間

冒號 : 的解釋:如果只放置一個參數,如 [2],將返回與該索引相對應的單個元素。如果為 [2:],表示從該索引開始以後的所有項都將被提取。如果使用了兩個參數,如 [2:7],那麼則提取兩個索引(不包括停止索引)之間的項。

切片還可以包括省略號 …,來使選擇元組的長度與數組的維度相同。 如果在行位置使用省略號,它將返回包含行中元素的 ndarray。

a[...,n]) # 第n+1列元素
a[n,...]) # 第n+1行元素
#!/usr/bin/env python  # -*- coding: utf-8 -*-    import numpy as np    if __name__ == '__main__':      a = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16]])      print(a)      print(a[..., 2])      print(a[1, ...])

高級索引:

  NumPy 比一般的 Python 序列提供更多的索引方式。除了之前看到的用整數和切片的索引外,數組可以由整數數組索引、布爾索引及花式索引。

#!/usr/bin/env python  # -*- coding: utf-8 -*-    import numpy as np  x = np.array([[1,  2],  [3,  4],  [5,  6]])  y = x[[0,1,2],  [0,1,0]]  print(x)  print (y)

在y的輸出我們可以看到,我們對於X切片得到的y,其實[0,1,2],[0,1,0]兩個數組,我們得到的是第0,0;1,1;2,0三個數據。

  布爾索引:

import numpy as np    x = np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11]])  print('我們的數組是:')  print(x)  print('n')  # 現在我們會列印出大於 5 的元素  print('大於 5 的元素是:')  print(x[x > 5])

我們得到的是所有大於5的元素。