在绘图或者计算函数值的时候,我们常常需要生成一些序列,比如生成 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 个点。