获得所需内容的最佳方式是使用linspace。要获得与您的示例几乎相同的向量x,您应该这样做
x = np.linspace(-np.pi/4, np.pi/4, round(np.pi / 2 / 0.001) + 1)
或者干脆
x = np.linspace(-np.pi/4, np.pi/4, npoints)
这会给您准确 npoints 点,并且保证包含开始和停止值。
使用np.arange(start, stop, step) 会为您提供start, start+step, start+2*step, ... 的点数,直到达到start+n*step < stop 的最终点数。由于浮点数不准确,最终点的n 是什么并不明显。 arange的manual备注:
当使用非整数步长时,例如 0.1,结果通常不会
始终如一。对于这些情况,最好使用 linspace。
通过生成一些 0 到 1 之间的可变步长范围,很容易证明这会导致不可预测的行为:
In [21]: for i in range(97,109):
...: r = np.arange(0, 1, 1. / i)
...: print 'step = 1.0 / {}, length = {}, last value = {}'.format(
...: i, len(r), r[-1])
...:
step = 1.0 / 97, length = 97, last value = 0.989690721649
step = 1.0 / 98, length = 99, last value = 1.0
step = 1.0 / 99, length = 99, last value = 0.989898989899
step = 1.0 / 100, length = 100, last value = 0.99
step = 1.0 / 101, length = 101, last value = 0.990099009901
step = 1.0 / 102, length = 102, last value = 0.990196078431
step = 1.0 / 103, length = 104, last value = 1.0
step = 1.0 / 104, length = 104, last value = 0.990384615385
step = 1.0 / 105, length = 105, last value = 0.990476190476
step = 1.0 / 106, length = 106, last value = 0.990566037736
step = 1.0 / 107, length = 108, last value = 1.0
step = 1.0 / 108, length = 108, last value = 0.990740740741
另请参阅this answer 的相关问题。