我正在尝试编写快速模拟程序。作为第一步,我想做一个输入并执行以下操作:
29.0
。27.5, 28.0, 28.5, 29.0, 29.5, 30, 30.5
这是我的程序 - 这部分解决了我的问题。
#!/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并在数字周围生成值?感谢任何帮助。
答案 0 :(得分:6)
首先是关于设计的几点说明:
您可能正在寻找np.arange
或np.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