Numpy 函式總結 (不斷更新)
本篇主要收集一些平時見到的 Numpy 函式。
numpy.random.seed & numpy.random.RandomState
np.random.seed()
和np.random.RandomState
都用於生成隨機數種子,np.random.seed()
是可以直接呼叫的方法,而np.random.RandomState
則是一個產生隨機數的容器,使用時需要建立例項物件,進而呼叫例項方法
,如np.random.RandomState(42).uniform()
。
隨機數種子seed
只有一次有效,在下一次呼叫產生隨機數函式前沒有設定seed
,則還是產生隨機數。如果需要每次都產生隨機數,則可以將隨機數seed
設定成None
,或者不設定。
>>> import numpy as np >>> np.random.seed(42) >>> np.random.randint(1, 10, 5)# array([5, 1, 2, 6, 1]) >>> np.random.seed(42) >>> np.random.randint(1, 10, 5)# array([5, 1, 2, 6, 1]) >>> np.random.randint(1, 10, 5)# array([8, 8, 3, 6, 5])
>>> from numpy.random import RandomState >>> r = RandomState(42) >>> r.randint(1, 10, 5)# array([9, 9, 7, 3, 9]) >>> r = RandomState(42) >>> r.randint(1, 10, 5)# array([9, 9, 7, 3, 9]) >>> r = RandomState(None) >>> r.randint(1, 10, 5)# array([8, 3, 2, 6, 5])
>>> import random# 使用Python的Random模組 >>> random.seed(42) >>> random.sample(range(10), 5)# [1, 0, 4, 9, 6] >>> random.sample(range(10), 5)# [6, 9, 1, 4, 5]
numpy.tile
numpy.tile(A, n)
用於將一整個陣列 A 重複 n 次。 下面是一個簡單的例子:
>>> a = [1,2,3,4] >>> np.tile(a, 3)# array([1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4])
然而如果 n 的長度大於 1,則情況就略複雜了。下面看個例子:
>>> a = np.array([1,2,3]) >>> np.tile(a, (3, 3)) array([[1, 2, 3, 1, 2, 3, 1, 2, 3], [1, 2, 3, 1, 2, 3, 1, 2, 3], [1, 2, 3, 1, 2, 3, 1, 2, 3]])
上面的原始陣列 a 為一維,n 的長度為 2,則 tile 函式會將原來的一維拓展為 2 維,再在每一維上重複相應的陣列,相當於下面兩步:
>>> a = np.array([1,2,3]) >>> a = np.expand_dims(a, axis=0) # a 為 array([[1, 2, 3]]) >>> np.tile(a, (3, 3))
上面的情況是 n 的長度大於 a 的維度,另一種情況是 n 的長度小於 a 的維度:
>>> b = np.array([[1,2,3], [4,5,6]]) >>> np.tile(b, 2) array([[1, 2, 3, 1, 2, 3], [4, 5, 6, 4, 5, 6]])
上面的情況是 b 的維度為 2,n 的長度為1,則同樣 n 會被擴充套件為 2,不足的維度用 1 填充,即變成 (1, 2),所以上例中 b 的第一維沒有被複制,被複制的是第二維。最後按慣例是一個複雜點的例子:
>>> c = np.arange(27).reshape((3,3,3)) 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], [24, 25, 26]]]) >>> np.tile(c, (2,2,2)) array([[[ 0,1,2,0,1,2], [ 3,4,5,3,4,5], [ 6,7,8,6,7,8], [ 0,1,2,0,1,2], [ 3,4,5,3,4,5], [ 6,7,8,6,7,8]], [[ 9, 10, 11,9, 10, 11], [12, 13, 14, 12, 13, 14], [15, 16, 17, 15, 16, 17], [ 9, 10, 11,9, 10, 11], [12, 13, 14, 12, 13, 14], [15, 16, 17, 15, 16, 17]], [[18, 19, 20, 18, 19, 20], [21, 22, 23, 21, 22, 23], [24, 25, 26, 24, 25, 26], [18, 19, 20, 18, 19, 20], [21, 22, 23, 21, 22, 23], [24, 25, 26, 24, 25, 26]], [[ 0,1,2,0,1,2], [ 3,4,5,3,4,5], [ 6,7,8,6,7,8], [ 0,1,2,0,1,2], [ 3,4,5,3,4,5], [ 6,7,8,6,7,8]], [[ 9, 10, 11,9, 10, 11], [12, 13, 14, 12, 13, 14], [15, 16, 17, 15, 16, 17], [ 9, 10, 11,9, 10, 11], [12, 13, 14, 12, 13, 14], [15, 16, 17, 15, 16, 17]], [[18, 19, 20, 18, 19, 20], [21, 22, 23, 21, 22, 23], [24, 25, 26, 24, 25, 26], [18, 19, 20, 18, 19, 20], [21, 22, 23, 21, 22, 23], [24, 25, 26, 24, 25, 26]]])
最後出來的結果其實非常具有對稱的美感。
另外與numpy.tile()
有密切聯絡的函式為numpy.repeat()
,其功能是對應元素重複:
>>> np.repeat(13, 5)# array([13, 13, 13, 13, 13])
numpy.repeat()
可以制定要重複的軸 (axis),但如果不指定,則將原陣列拉伸為 1 維陣列後再對應元素重複:
>>> a = np.array([[1,2], [3,4]]) >>> np.repeat(a, 3)# array([1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4]) >>> np.repeat(a, 3, axis=1) array([[1, 1, 1, 2, 2, 2], [3, 3, 3, 4, 4, 4]])
/