­

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

  • 2019 年 10 月 5 日
  • 筆記

  本來要寫NLP第三課動態規劃的,日了,寫到一半發現自己也不會了,理論很簡單,動態規劃咋回事也知道,但是實現在源碼上還是有點難度,現在簡單給予題目描述,小夥伴也可以來思考一下,例題一,我們現在有1元硬幣,2元硬幣,5元硬幣和10元硬幣。我們要將M金額的錢換為硬幣,保證硬幣數目最少,我們的換法是什麼,例題二,我們現在有M米的繩子,截成N段(N的長度一定為整數),將N段繩子的長度相乘,保證乘積結果為最大值,我們需要截取,過幾天再回頭來寫這個吧。我們今天來繼續說說numpy的用法,這次我們通過習題來看看numpy的用法。

  問題:將arr中的所有奇數替換為-1,而不改變arr。(提示where)

arr = np.arange(10)  out = np.where(arr % 2 == 1, -1, arr) 

where語法為,參數一是條件,參數二是滿足條件的要替換為什麼,參數三是輸入array。

  問題:將一維數組轉換為2行的2維數組,給定:np.arange(10)

arr = np.arange(10)  out = np.reshape(2,-1) 
reshape語法為(行,列)若參數二列為-1,為不限制

  問題:垂直堆疊數組a和數組b,給定:a = np.arange(10).reshape(2,-1) b = np.repeat(1, 10).reshape(2,-1) 期望的輸出:

> array([[0, 1, 2, 3, 4],

> [5, 6, 7, 8, 9],

> [1, 1, 1, 1, 1],

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

a = np.arange(10).reshape(2,-1)  b = np.repeat(1, 10).reshape(2,-1)  np.concatenate([a, b], axis=0) # 方法一  np.vstack([a, b])  # 方法二  np.r_[a, b] # 方法三

方法一:concatenate語法是參數一列表,axis=0為縱向堆疊,1位橫向

方法二:vstack垂直堆疊,擴展hstack為橫向。

方法三:r_垂直堆疊,擴展c_為橫向。

問題:創建以下模式而不使用硬編碼。只使用numpy函數和下面的輸入數組a。

給定:

a = np.array([1,2,3])` 期望的輸出:

> array([1, 1, 1, 2, 2, 2, 3, 3, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3])

a = np.array([1,2,3])  np.r_[np.repeat(a, 3), np.tile(a, 3)]

說明:np.repeat(a, 3)獲得到array([1, 1, 1, 2, 2, 2, 3, 3, 3]),np.tile(a, 3)獲得到array([1, 2, 3, 1, 2, 3, 1, 2, 3]),然後應r_進行堆疊

  問題:獲取數組a和數組b之間的公共項。ab的交集

np.intersect1d(a,b)

  問題:從數組a中刪除數組b中的所有項。給定:a = np.array([1,2,3,4,5]) b = np.array([5,6,7,8,9]) 期望的輸出:>array([1,2,3,4])

a = np.array([1,2,3,4,5])  b = np.array([5,6,7,8,9])  np.setdiff1d(a,b)

setdiffld使用時注意順序,在第一個參數內除去包含第二個元素的數據,且不包含剩餘第二個參數的元素。(可能有點繞嘴)。

  問題:獲取a和b元素匹配的位置。

a = np.array([1,2,3,2,3,4,3,4,5,6])  b = np.array([7,2,10,2,7,4,9,4,9,8])  np.where(a==b)

  問題:獲取5到10之間的所有項目。

a = np.array([2, 6, 1, 9, 10, 3, 27])  index = np.where((a >= 5) & (a <= 10))  a[index]

  問題:在數組arr中交換行1和2。

arr = np.arange(9).reshape(3,3)  arr[[1,0,2],:]

  問題:在數組arr中交換列1和2。

arr = np.arange(9).reshape(3,3)  print(arr)  arr[:, [1,0,2]]

  問題:反轉二維數組arr的行。

arr = np.arange(9).reshape(3,3)  arr[::-1]

  問題:反轉二維數組arr的列。

arr = np.arange(9).reshape(3,3)  arr  arr[:, ::-1]

  問題:創建一個形狀為5×3的二維數組,以包含5到10之間的隨機十進位數。

arr = np.arange(9).reshape(3,3)    # Solution Method 1:  rand_arr = np.random.randint(low=5, high=10, size=(5,3)) + np.random.random((5,3))  # print(rand_arr)    # Solution Method 2:  rand_arr = np.random.uniform(5,10, size=(5,3))  print(rand_arr)

這裡需要詳細說明一下,arr[a,b] 也就是arr的切片 例如:a[2:7:2] # 從索引 2 開始到索引 7 停止,間隔為 2,而在我們的二維數組中,我們可以使用『,』;例如a[X,M],這時我們就取出,第X+1行的第M+1個元素。

還有:和,還有…並用的。我們來看一個例子,:也就是所有,例如a[:,2]就是我們要取出管他多少行的第三列所有。同事a[2,:]也是如此,第二行的所有,管他多少列呢。

我們上面說的::N兩個冒號連接在一起就是從第:個元素,取到第:個元素,步長是N,::也就是說取得所有吧。步長為負數時會反轉。下期我們繼續說說Nump的用法吧~!