创建围绕零镜像的数字列表(python)

Tom*_*Tom 3 python numpy list

我认为这应该是一个简单的问题...但是它已经让我困扰了一段时间:(

我希望从指定最大值和增量的输入中创建一个数字列表,该列表以零为中心。所以,

max = 100
increment = 1 
Run Code Online (Sandbox Code Playgroud)

会回来

[-100,-99,-98,...,-1,0,1,...,99,100]
Run Code Online (Sandbox Code Playgroud)

max = 35
increment = 0.2
Run Code Online (Sandbox Code Playgroud)

会回来

[-35.0,-34.8,...,-0.2,0,0.2,...34.8,35.0]
Run Code Online (Sandbox Code Playgroud)

如果增量没有整齐地划分为最大值,则需要做一个短的最后一步(例如,如果以0.3增量计数到1,它将运行 [-1.0,-0.6,-0.3,0.0,0.3,0.6,0.9,1.0]

list(numpy.linspace()) 似乎是要走的路,但我似乎对如何以最简单的情况以外的任何方式描述的方式进行这项工作有一个完整的思路。

建议表示赞赏!

编辑:我自己的解决方案是

def mylist(stop,step):
    a = list(np.arange(0,-stop,-step))+[-stop]
    a.reverse()
    b = list(a)
    c = list(np.arange(0,stop,step))+[stop]
    d = b+c
    d.remove(0)
    e = list(d)
    return e
Run Code Online (Sandbox Code Playgroud)

哪怕我也看得出来,这太笨拙了。

最好的答案是:

def mirrored(maxval, inc):
    x = np.arange(inc, maxval, inc)
    if x[-1] != maxval:
        x = np.r_[x, maxval]
    return np.r_[-x[::-1], 0, x]
Run Code Online (Sandbox Code Playgroud)

但是我将不得不在Google上多花一点时间来了解为什么它行得通(也不确定我是否要四舍五入……增量的输入可能被合法地指定为多个小数位)

Joe*_*ton 5

如果要严格围绕镜像0(即始终包括0和端点,并且关于0完全对称),则需要几个步骤。

首先,请注意上面的@NPE评论。浮点数学与十进制数学不同!!这似乎没有意义,但在某些情况下咬住您。

有多种方法可以做到这一点。您是否希望所有数字均等分布,还是坚持递增而仅在端点处违反?这种方法采用了两者中的后者。

import numpy as np

def mirrored(maxval, inc=1):
    x = np.arange(inc, maxval, inc)
    if x[-1] != maxval:
        x = np.r_[x, maxval]
    return np.r_[-x[::-1], 0, x]

print mirrored(1, 0.3)
Run Code Online (Sandbox Code Playgroud)

这样产生:

[-1.  -0.9 -0.6 -0.3  0.   0.3  0.6  0.9  1. ]
Run Code Online (Sandbox Code Playgroud)

如果您希望所有数字均等分布(而不是您指定的确切增量),请使用linspace:

import numpy as np

def mirrored2(maxval, inc=1):
    return np.linspace(-maxval, maxval, 2*maxval // inc)

print mirrored2(1, 0.3)
Run Code Online (Sandbox Code Playgroud)

这样产生:

[-1.  -0.6 -0.2  0.2  0.6  1. ]
Run Code Online (Sandbox Code Playgroud)