在繪圖或者計算函數值的時候,我們常常需要生成一些序列,比如生成 0~1000 之間的整數。這時,我們經常用到 Numpy 中的 linspace 和 arange 函數。然而稍不注意,兩者就容易用錯,特別是linspace,現在對兩者的用法和區別說明如下,並指出兩者容易用錯的地方。
1、arange 函數的用法
爲了便於分析,我們假設要生成 0~10 間的整數序列 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],首先 arange 的用法如下:
import numpy as np
x = np.arange(0,10,1) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],注意,沒有10
這是arange 的用法:arange(起始值,結束值,間隔) ,需要注意的是,結束值(本例中爲10)並不包含在生成的序列中。
2、linspace 函數的用法
同樣,我們可以用 linespace 函數來生成這個序列,它的用法爲——linspace(起始值,結束值,起始值和結束值之間的個數) ,這樣就可以生成等分間隔的序列。但是,針對上述問題,我們很容易想當然地寫出以下代碼:
x=np.linspace(0,10,10) # [ 0. , 1.11111111, 2.22222222, 3.33333333, 4.44444444, 5.55555556, 6.66666667, 7.77777778, 8.88888889, 10. ]
實際上這是錯誤的寫法,它生成的序列爲 [ 0. , 1.11111111, 2.22222222, 3.33333333, 4.44444444, 5.55555556, 6.66666667, 7.77777778, 8.88888889, 10. ],很顯然,不符合我們的預期,那麼問題出在哪裏呢? 它的問題出在 linespace 函數把結束值也包含在生成的序列中,所以兩數之間的間隔就變成了10/9,要解決這個問題,有兩種辦法:
第一種方法是把 linspace 的結束值設爲 9:
x = np.linspace(0,9,10) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
第二種方法是讓linspace 函數生成的序列不包含結束值:
x = np.linspace(0,10,10,endpoint=False) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
3、總結
1、arange(初始值,結束值,間隔) 生成的序列不包含結束值,linspace(初始值, 結束值, 值的個數) 生成的序列包含結束值。
2、如果要使 linspace 和 arrange 等效,可以用 linspace(初始值, 結束值, 值的個數, endpoint = False). 當然,兩者有各自的使用場景,儘量不要混用。arrange 適用於知道序列中相鄰兩數之間的間隔的情況下,比如生成一定範圍內奇數或者偶數的序列。linspace 適合序列長度和序列取值範圍已知的情況。比如採樣頻率爲1200 Hz, 也就是說 0~1s 之間有1200 個點。