NumPy 是 Python 的外部庫,不在標準庫中,若要使用它,需要先導入 NumPy:
import numpy as np
導入 NumPy 庫後,可通過np.+Tab鍵查看可使用的函數,如果對其中一些函數的使用不是很清楚,還可以在對應函數加上?,再運行,就可以很方便地看到如何使用函數的幫助信息。
輸入np.然後按 Tab 鍵,將出現如下界面:
圖1:查看 NumPy 可以使用的函數
運行如下命令,便可查看函數 abs 的詳細幫助信息。
np.abs?
NumPy 不但強大,而且還非常友好。下面將介紹Numpy的一些常用方法,尤其是與機器學習、深度學習相關的一些內容。
NumPy 封裝了一個新的數據類型 ndarray(N-dimensional Array),它是一個多維數組對象。該對象封裝了許多常用的數學運算函數,方便我們做數據處理、數據分析等。那麼,如何生成 ndarray 呢?這裡介紹生成 ndarray 的幾種方式,包括:
直接對 Python 的基礎數據類型(如列表、元組等)進行轉換來生成 ndarray:
1) 將列錶轉換成 ndarray:
import numpy as npls1 = [10, 42, 0, -17, 30]nd1 =np.array(ls1)print(nd1)print(type(nd1))運行結果:
[ 10 42 0 -17 30]
<class 'numpy.ndarray'>
2) 嵌套列表可以轉換成多維 ndarray:import numpy as npls2 = [[8, -2, 0, 34, 7], [6, 7, 8, 9, 10]]nd2 =np.array(ls2)print(nd2)print(type(nd2))運行結果:
[[ 8 -2 0 34 7]
[ 6 7 8 9 10]]
<class 'numpy.ndarray'>利用 random 模塊生成數組
對於上面兩個例子,也可以把列表換成元組,同樣也適用。在深度學習中,我們經常需要對一些參數進行初始化,因此為了更有效地訓練模型,提高模型的性能,有些初始化還需要滿足一定的條件,如滿足正態分布或均勻分布等。這裡介紹了幾種 np.random 模塊中常用的方法,如下表所示。
表1:np.random 模塊常用函數函數描述np.random.random生成0到1之間的隨機數np.random.uniform生成均勻分布的隨機數np.random.randn生成標準正態的隨機數np.random.randint生成隨機的整數np.random.normal生成正態分布np.random.shuffle隨機打亂順序np.random.seed設置隨機數種子random_sample生成隨機的浮點數
下面來看一些函數的具體使用:
import numpy as np
nd3 =np.random.random([4, 3]) #生成4行3列的數組
print(nd3)
print("nd3的形狀為:",nd3.shape)
運行結果:
[[0.59115057 0.52022516 0.05992361]
[0.5077815 0.81313999 0.70061259]
[0.24654561 0.11705634 0.71399966]
[0.73964407 0.57138345 0.89284498]]
nd3的形狀為:(4, 3)
為了每次生成同一份數據,可以指定一個隨機種子,使用 shuffle() 函數打亂生成的隨機數。import numpy as npnp.random.seed(123)nd4 = np.random.randn(4, 3)print(nd4)np.random.shuffle(nd4)print("隨機打亂後數據:")print(nd4)print(type(nd4))運行結果:
[[-1.0856306 0.99734545 0.2829785 ]
創建特定形狀的多維數組
[-1.50629471 -0.57860025 1.65143654]
[-2.42667924 -0.42891263 1.26593626]
[-0.8667404 -0.67888615 -0.09470897]]
隨機打亂後數據:
[[-1.50629471 -0.57860025 1.65143654]
[-2.42667924 -0.42891263 1.26593626]
[-0.8667404 -0.67888615 -0.09470897]
[-1.0856306 0.99734545 0.2829785 ]]
<class 'numpy.ndarray'>參數初始化時,有時需要生成一些特殊矩陣,如全是 0 或 1 的數組或矩陣,這時我們可以利用 np.zeros、np.ones、np.diag 來實現,如下表所示。
表2:NumPy 自帶的數組創建函數函數描述np.zeros((3, 4))創建 3×4 的元素全為 0 的數組np.ones((3, 4))創建 3×4 的元素全為 1 的數組np.empty((2, 3))創建 2×3 的空數組,空數據中的值並不為 0,而是未初始化的垃圾值np.zeros_like(ndarr)以 ndarr 相同維度創建元素全為 0數組np.ones_like(ndarr)以 ndarr 相同維度創建元素全為 1 數組np.empty_like(ndarr)以 ndarr 相同維度創建空數組np.eye(5)該函數用於創建一個 5×5 的矩陣,對角線為 1,其餘為 0np.full((3,5), 10)創建 3×5 的元素全為 10 的數組,10 為指定值
下面通過幾個示例說明:import numpy as npnd5 =np.zeros([3, 3])nd6 = np.ones([3, 3])nd7 = np.eye(4)nd8 = np.diag([1, 8, 3, 10])print("nd5 =\n", nd5)print("nd6 =\n", nd6)print("nd7 =\n", nd7)print("nd8 =\n", nd8)運行結果:
nd5 =
[[0. 0. 0.]
[0. 0. 0.]
[0. 0. 0.]]
nd6 =
[[1. 1. 1.]
[1. 1. 1.]
[1. 1. 1.]]
nd7 =
[[1. 0. 0. 0.]
[0. 1. 0. 0.]
[0. 0. 1. 0.]
[0. 0. 0. 1.]]
nd8 =
[[ 1 0 0 0]
[ 0 8 0 0]
[ 0 0 3 0]
[ 0 0 0 10]]
有時還可能需要把生成的數據暫時保存到文件中,以備後續使用。import numpy as npnd9 =np.random.random([3, 5])np.savetxt(X=nd9, fname='./data.txt')nd10 = np.loadtxt('./data.txt')print(nd10)運行結果:
[[0.1744383 0.15515217 0.74885812 0.57633094 0.06300636]
[0.24340527 0.65213913 0.07284238 0.52232677 0.58538849]
[0.83611286 0.76508018 0.26018483 0.20485587 0.95476232]]打開當前目錄下的 data.txt 也可以看到格式化的數據。
利用 arange() 和 linspace() 函數生成數組arange() 是 numpy 模塊中的函數,其格式為:
arange([start,] stop[,step,], dtype=None)
其中,start 與 stop 用來指定範圍,step 用來設定步長。在生成一個 ndarray 時,start 默認為0,步長 step 可為小數。Python 有個內置函數 range,其功能與此類似。
請看下面的代碼:import numpy as npprint(np.arange(10))print(np.arange(0, 10))print(np.arange(1, 4, 0.5))print(np.arange(9, -1, -1))運行結果:
[0 1 2 3 4 5 6 7 8 9]
[0 1 2 3 4 5 6 7 8 9]
[1. 1.5 2. 2.5 3. 3.5]
[9 8 7 6 5 4 3 2 1 0]
linspace() 也是 numpy 模塊中常用的函數,其格式為:np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
linspace() 可以根據輸入的指定數據範圍以及等份數量,自動生成一個線性等分向量,其中 endpoint(包含終點)默認為 True,等分數量 num 默認為 50。如果將 retstep 設置為True,則會返回一個帶步長的 ndarray。
請看下面的代碼:import numpy as npprint(np.linspace(0, 1, 10))運行結果:
[0. 0.11111111 0.22222222 0.33333333 0.44444444 0.55555556
0.66666667 0.77777778 0.88888889 1. ]值得一提的是,這裡並沒有像我們預期的那樣,生成 0.1,0.2,...,1.0 這樣步長為 0.1 的 ndarray,這是因為 linspace 必定會包含數據起點和終點,那麼其步長則為 (1-0)/9=0.11111111。如果需要產生 0.1,0.2,...,1.0 這樣的數據,只需要將數據起點 0 修改為 0.1 即可。
除了上面介紹到的 arange() 和 linspace(),NumPy 還提供了 logspace() 函數,該函數的使用方法與 linspace() 的使用方法一樣,讀者不妨自己動手試一下。