2011-07-13 34 views
23

¿Qué es una forma pitónica de hacer una lista de longitud arbitraria que contiene números espaciados uniformemente (no solo enteros enteros) entre límites dados? Por ejemplo:Hacer una lista de números espaciados uniformemente en un cierto rango en python

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 ] 

Nota la función Range() sólo se ocupa de los números enteros. Y esto:

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 

parece demasiado complicado. ¿Algunas ideas?

+0

Hubo algunas soluciones bonito: http://stackoverflow.com/questions/477486/python-decimal-range-step-value – Pill

+1

Tenga en cuenta que esto solo funciona con precisión para algunas secuencias debido a la inexactitud (necesaria) de los números de coma flotante. – delnan

Respuesta

40

Dada numpy, podría utilizar linspace:

Incluyendo el extremo derecho (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.  ]) 

Excluyendo el punto final derecho:

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

Para ser justos esto le da una matriz numpy no una lista ... –

+5

@Doble AA: Verdadero; si necesita una lista, puede usar 'np.linspace (0,5,10) .tolist()'. – unutbu

23

Puede utilizar el siguiente enfoque:

[lower + x*(upper-lower)/length for x in range(length)] 

inferior y/o superior debe ser asignado como flotadores de este enfoque de trabajo.

+3

Es bueno tener una alternativa concisa de stock python en caso de que numpy no esté disponible. – feedMe

1
f = 0.5 
a = 0 
b = 9 
d = [x * f for x in range(a, b)] 

sería una manera de hacerlo.

0

Similar a la respuesta de Howard, pero un poco más eficiente:

def my_func(low, up, leng): 
    step = ((up-low) * 1.0/leng) 
    return [low+i*step for i in xrange(leng)] 
4

Similar a la respuesta de unutbu, puedes usar la función arange de numpy, que es análoga al rango de función intrínseca de python. Observe que no se incluye el punto final, como en la gama:

>>> import numpy as N 
>>> a=N.arange(0,5,0.5) 
>>> a 
array([ 0. , 0.5, 1. , 1.5, 2. , 2.5, 3. , 3.5, 4. , 4.5]) 
>>> import numpy as N 
>>> a=N.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] 
+0

O simplemente: a = N. arange (0, 5, 0.5) .tolist() – nvd

+2

Sin embargo, al usar numpy.arange(), los puntos finales no se manejan de forma consistente, dando lugar a un comportamiento poco confiable, consulte [aquí] (http://quantumwise.com/forum/index.php?topic=110.0). – lhcgeneva

1

Usted puede utilizar el código folowing:

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)] 
Cuestiones relacionadas