【翻譯】高效numpy指北
阿新 • • 發佈:2021-07-14
ref:link
why numpy
- 運算高效
numpy
記憶體結構
- 一塊記憶體區域
dtype
確定了記憶體區域資料型別metadata
比如shape
、strides
etc
注:numpy
記憶體佔用和 C
基本相同,多了常數記憶體消耗
numpy
廣播機制
自動將常數變為可以參與運算的形式
- 無需對常數變成可以進行運算的大小(自動)
注意:
- 廣播機制是邏輯上的參與運算,並沒有建立相應的矩陣(向量)
indexing
陣列切片
[::k]
k
是步長
import numpy as np x = np.arange(6).reshape(2,3) ''' x=[[0,1,2], [3,4,5]] ''' x[:,::2] ''' [[0, 2], [3, 5]] ''' x[::2,::2] ''' array([[0, 2]]) ''' x[:,::-1] ''' array([[2, 1, 0], [5, 4, 3]]) ''' x[::-1,::-1] ''' array([[5, 4, 3], [2, 1, 0]]) '''
簡單的index 返回的是原陣列的一個view,而非copy
x[::-1,::-1] ''' array([[5, 4, 3], [2, 1, 0]]) ''' >>> x[::-1,::-1][1][1]=120 >>> x array([[ 0, 120, 2], [ 3, 4, 5]]) >>> c =x[::-1,::-1] >>> c[0][0]=123 >>> x array([[ 0, 1, 2], [ 3, 4, 123]])
fancy indexing
fancy index 返回值 通常是一個 copy。
-
mask
>>> x = np.arange(6).reshape(2,3) >>> x array([[0, 1, 2], [3, 4, 5]]) >>> mask = x%2==0 >>> mask array([[ True, False, True], [False, True, False]], dtype=bool >>> x[mask] array([0, 2, 4]) ## 測試返回的是copy 而不是 view >>> x[mask][0]=122 >>> x array([[0, 1, 2], [3, 4, 5]])
-
通過index選擇
>>> x = np.arange(6) >>> x array([[0, 1, 2, 3, 4, 5]]) >>> indices =[1,2,-1,1] >>> x[indices] array([1, 2, 5, 1])