使用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的元素。