Python numpy linspace用于小数的情况下

4

我在使用linspace函数时遇到了一些问题。我想生成一个数字数组,例如:

[0.000001, 0.00001, 0.0001 , 0.001 ,0 .01 , 0.1]

所以我尝试了下面的代码:

alphas = np.linspace(0.0000001,10,num=11)
print(alphas)

获得了结果:

[  1.00000000e-07   1.00000009e+00   2.00000008e+00   3.00000007e+00
4.00000006e+00   5.00000005e+00   6.00000004e+00   7.00000003e+00
8.00000002e+00   9.00000001e+00   1.00000000e+01]

我原本认为这是显示和格式的问题,但在尝试后发现不是这个问题。

if(alphas[0]>1):
    print("yes the first number is greater than 1")
if(alphas[1]>1):
    print("yes the second number is greater than 1")

第二个数字确实大于1,那么我的问题是什么?既然linspace应该“在指定的区间内返回均匀间隔的数字”。
3个回答

5
它正在执行你所要求的操作:在1e-7和10之间创建一个线性递增的数字集。由于这几乎与0到10的范围相同,因此得到增量为一并不奇怪。
在你的情况下,你需要的是np.logspace,它可以给你一个对数增长。
In [2]: np.logspace(-7, 1, num=11)
Out[2]: 
array([  1.00000000e-07,   6.30957344e-07,   3.98107171e-06,
         2.51188643e-05,   1.58489319e-04,   1.00000000e-03,
         6.30957344e-03,   3.98107171e-02,   2.51188643e-01,
         1.58489319e+00,   1.00000000e+01])

正如Warren Weckesser所指出的那样,从NumPy 1.12开始,还有np.geomspace函数,它稍微更容易使用,因为您可以直接给出端点,而不是它的十的幂:

np.geomspace(1e-7, 10, num=11)


如果你想要的是在代码中使用 np.logspace ...,或者如果你正在使用最新版本的 numpy,则可以使用 geomspace。 - Warren Weckesser
@WarrenWeckesser 啊,太好了,我错过了这个。非常方便。 - Hannes Ovrén

4

如果您想让系列看起来像您展示的那样,可以仅采用10的幂次。如果您想在对数空间中获得均匀间距,请选择Hannes Ovrén的答案。

alpha = 10.**np.arange(-7, 2)

打印 alpha 的结果是:

Out[1]: 
array([  1.00000000e-07,   1.00000000e-06,   1.00000000e-05,
         1.00000000e-04,   1.00000000e-03,   1.00000000e-02,
         1.00000000e-01,   1.00000000e+00,   1.00000000e+01])

1
你可以使用列表推导式:
>>> a=[10.0**i for i in range(-7,-0)]
>>> a
[1e-07, 1e-06, 1e-05, 0.0001, 0.001, 0.01, 0.1]

2
或者 10**np.arange(-7,0) - hpaulj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接