我正在构建两个数字(浮点数)之间的范围,我希望这个范围具有确切的固定长度(不多也不少)。 range
和arange
使用步骤。把东西放到伪Python中,这就是我想要实现的目标:
start_value = -7.5
end_value = 0.1
my_range = my_range_function(star_value, end_value, length=6)
print my_range
[-7.50,-5.98,-4.46,-2.94,-1.42,0.10]
这基本上等同于R函数seq
,它可以指定给定长度的序列。这在Python中是否可行?
感谢。
答案 0 :(得分:6)
使用NumPy中的linspace()。
>>> from numpy import linspace
>>> linspace(-7.5, 0.1, 6)
array([-7.5 , -5.98, -4.46, -2.94, -1.42, 0.1])
>>> linspace(-7.5, 0.1, 6).tolist()
[-7.5, -5.9800000000000004, -4.46, -2.9399999999999995, -1.4199999999999999, 0.10000000000000001]
它应该是最有效和准确的。
答案 1 :(得分:4)
请参阅Recipe 66472: frange(), a range function with float increments (Python)各种浮动实现,它们的优点和缺点。
或者,如果精确度对您很重要,请按照Python decimal range() step value中的回答使用decimal.Decimal
而不是浮动(转换为然后返回)。
答案 2 :(得分:2)
def my_function(start, end, length):
len = length - 1
incr = (end-start) / len
r = [ start ]
for i in range(len):
r.append ( r[i] + incr )
return r
答案 3 :(得分:1)
这个怎么样:
def my_range_function(start, end, length):
if length <= 1: return [ start ]
step = (end - start) / (length - 1)
return [(start + i * step) for i in xrange(length)]
对于您的样本范围,它会返回:
[-7.5, -5.9800000000000004, -4.46,
-2.9399999999999995, -1.4199999999999999, 0.099999999999999645]
当然它充满了圆形错误,但这就是你使用花车时所得到的。
答案 4 :(得分:1)
为了处理舍入错误,以下代码使用Python的decimal module。你可以设置舍入;对于这个样本,我通过round_setting = '.01'
将它设置为两个小数点。为了处理任何舍入误差,最后一步调整为余数。
#!/usr/bin/env python
# encoding: utf-8
from __future__ import print_function
import math
import decimal
start_value = -7.5
end_value = 0.1
num_of_steps = 6
def my_range(start_value, end_value, num_of_steps):
round_setting = '.01'
start_decimal = decimal.Decimal(str(start_value)).quantize(
decimal.Decimal(round_setting))
end_decimal = decimal.Decimal(str(end_value)).quantize(
decimal.Decimal(round_setting))
num_of_steps_decimal = decimal.Decimal(str(num_of_steps)).quantize(
decimal.Decimal(round_setting))
step_decimal = ((end_decimal - start_decimal) /
num_of_steps_decimal).quantize(decimal.Decimal(round_setting))
# Change the last step in case there are rounding errors
last_step_decimal = (end_decimal - ((num_of_steps - 1) * step_decimal) -
start_decimal).quantize(decimal.Decimal(round_setting))
print('Start value = ', start_decimal)
print('End value = ', end_decimal)
print('Number of steps = ', num_of_steps)
print('Normal step for range = ', step_decimal)
print('Last step used for range = ', last_step_decimal)
my_range(start_value, end_value, num_of_steps)
$ ./fixed_range.py
Start value = -7.50
End value = 0.10
Number of steps = 6
Normal step for range = 1.27
Last step used for range = 1.25
从那里,您可以使用正常步骤和最后一步来创建列表。