在python中围绕一个值生成10个值

时间:2018-04-06 15:39:26

标签: python numpy generator

我正在尝试编写快速模拟程序。作为第一步,我想做一个输入并执行以下操作:

  1. 使用此输入从dict中找到相应的值,比如I 在我的例子中得到29.0
  2. 我现在想在左边生成3个值,在右边生成3个值。理想情况下,输出应为27.5, 28.0, 28.5, 29.0, 29.5, 30, 30.5
  3. 这是我的程序 - 这部分解决了我的问题。

    #!/usr/bin/python
    def getids(tk):
        tk=tk.lower()
            r=map(lambda x:x/10.0,range(0,6))   
        val={'PPP':29}
        val={k.lower():v for k,v in val.items()}
        if tk in val:
            stk_price=val[tk]   
        for i in r:
            stk_price=stk_price + i
            print(stk_price)
    getids('PPP')
    

    输出

    29.0
    29.1
    29.3
    29.6
    30.0
    30.5
    

    是否可以使用numpy并在数字周围生成值?感谢任何帮助。

4 个答案:

答案 0 :(得分:6)

首先是关于设计的几点说明:

  1. 你的字典应该存在于函数之外,否则每次都会重新创建,这是毫无意义和低效的。
  2. 如果您有一个获得范围的功能,请让它返回范围。如果您想打印范围或使用它做其他事情,请在功能之外执行此操作。
  3. 您可能正在寻找np.arangenp.linspace。对于您的简单应用,它们基本上是等效的。这尤其正确,因为步进增量为0.5时没有舍入误差。

    对于给定的x,例如29,您可以执行以下任一操作:

    step = 0.5
    price_range = np.arange(x - step * 3, x + step * 4, step)
    

    OR

    step = 0.5
    price_range = np.linspace(x - step * 3, x + step * 3, 7)
    

    我个人认为linspace在这里更容易理解,因为你只是给它限制和点数。对于arange,您必须记住停止是独占的,因此您必须为x + step * 3添加边距。

    我建议像这样重写你的程序:

    stocks = {
        'PPP': 29,
    }
    # Notice that this only runs once instead of once per function call now
    # casefold is the more generalized unicode version of lower
    stocks = {key.casefold: value for key, value in stocks}
    
    def getids(tk, margin=3, step=0.5):
        tk = tk.casefold()
        if tk in val:
            price = val[tk]
            return np.linspace(price - margin * step,
                               price + margin * step, 2 * margin + 1)
        return []
    
    print(getids('PPP'))
    

    如果您想要之前的完全输出,只需使用换行符加入元素:

    print('\n'.join(map(str, getids('PPP'))))
    

    或等效,

    print('\n'.join(str(x) for x in getids('PPP')))
    

答案 1 :(得分:3)

您可以使用numpy的arange功能。

最小例子:

import numpy as np

num = 29    
np.arange(num-1.5, num+2, 0.5) # (start, stop, step)

输出

array([ 27.5,  28. ,  28.5,  29. ,  29.5,  30. ,  30.5])

答案 2 :(得分:3)

script.py非常相似,使用logging.debug('stuff'),您可以得到一个均匀间隔的数组,无论您想要多长。因此,在您的情况下,要在左侧获得3个值并在右侧获得3个值(+1以包含您的实际值),您将需要总共7个值。你可以这样得到它们:

np. arange

答案 3 :(得分:2)

免责声明:不是一个笨拙的解决方案,而是普通的老蟒蛇。

您可以使用范围/ delta和围绕piveau值的步骤组合生成它们:

def getSeries(piv, nums, delta):
    """Yields [piv + (-nums * delta):piv + nums * delta] in steps of delta"""
    for k in range(-nums,nums+1):
       yield piv + k*delta

for n in getSeries(29,3,0.5):
    print(f'{n:.1f}')

输出:

27.5  # -3
28.0  # -2
28.5  # -1
29.0  # piveau
29.5  #  1
30.0  #  2
30.5  #  3