Создание списка равномерно расположенных номеров в определенном диапазоне в python
Что такое pythonic способ сделать список произвольной длины, содержащий равномерно распределенные числа (а не целые целые числа) между заданными границами? Например:
my_func(0,5,10) # ( lower_bound , upper_bound , length )
# [ 0, 0.5, 1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5 ]
Обратите внимание, что функция Range()
работает только с целыми числами. И это:
def my_func(low,up,leng):
list = []
step = (up - low) / float(leng)
for i in range(leng):
list.append(low)
low = low + step
return list
кажется слишком сложным. Любые идеи?
Ответы
Ответ 1
Учитывая numpy, вы можете использовать linspace:
Включение правой конечной точки (5):
In [46]: import numpy as np
In [47]: np.linspace(0,5,10)
Out[47]:
array([ 0. , 0.55555556, 1.11111111, 1.66666667, 2.22222222,
2.77777778, 3.33333333, 3.88888889, 4.44444444, 5. ])
Исключение правой конечной точки:
In [48]: np.linspace(0,5,10,endpoint=False)
Out[48]: array([ 0. , 0.5, 1. , 1.5, 2. , 2.5, 3. , 3.5, 4. , 4.5])
Ответ 2
Вы можете использовать следующий подход:
[lower + x*(upper-lower)/length for x in range(length)]
нижний и/или верхний должны быть назначены как поплавки для работы этого подхода.
Ответ 3
Подобно unutbu answer, вы можете использовать функцию numpy arange, которая аналогична range
встроенных функций Python. Обратите внимание, что конечная точка не включена, как в range
:
>>> import numpy as np
>>> a = np.arange(0,5, 0.5)
>>> a
array([ 0. , 0.5, 1. , 1.5, 2. , 2.5, 3. , 3.5, 4. , 4.5])
>>> a = np.arange(0,5, 0.5) # returns a numpy array
>>> a
array([ 0. , 0.5, 1. , 1.5, 2. , 2.5, 3. , 3.5, 4. , 4.5])
>>> a.tolist() # if you prefer it as a list
[0.0, 0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5]
Ответ 4
f = 0.5
a = 0
b = 9
d = [x * f for x in range(a, b)]
- это способ сделать это.
Ответ 5
Вы можете использовать следующий код:
def float_range(initVal, itemCount, step):
for x in xrange(itemCount):
yield initVal
initVal += step
[x for x in float_range(1, 3, 0.1)]
Ответ 6
Подобно Говарду, но немного эффективнее:
def my_func(low, up, leng):
step = ((up-low) * 1.0 / leng)
return [low+i*step for i in xrange(leng)]
Ответ 7
Удобная функция Numpy r_
также может создавать равномерно распределенные списки с синтаксисом np.r_[start:stop:steps]
. Если steps
- это действительное число (оканчивающееся на j
), то включается конечная точка, эквивалентная np.linspace(start, stop, step, endpoint=1)
, в противном случае - нет.
>>> np.r_[-1:1:6j, [0]*3, 5, 6]
array([-1. , -0.6, -0.2, 0.2, 0.6, 1.])
Вы также можете напрямую объединить другие массивы, а также скаляры:
>>> np.r_[-1:1:6j, [0]*3, 5, 6]
array([-1. , -0.6, -0.2, 0.2, 0.6, 1. , 0. , 0. , 0. , 5. , 6. ])