Pregunta ¿Cómo usar un valor de paso de rango decimal ()?


¿Hay alguna manera de pasar de 0 a 1 por 0.1?

Pensé que podría hacerlo como el siguiente, pero falló:

for i in range(0, 1, 0.1):
    print i

En cambio, dice que el argumento del paso no puede ser cero, lo que no esperaba.


508
2018-01-25 10:20


origen


Respuestas:


También puedes usar el NumPy biblioteca (que no es parte de la biblioteca estándar pero es relativamente fácil de obtener) que tiene arange función:

>>> import numpy as np
>>> np.arange(0.0, 1.0, 0.1)
array([ 0. ,  0.1,  0.2,  0.3,  0.4,  0.5,  0.6,  0.7,  0.8,  0.9])

así como el linspace función que le permite tener control sobre lo que sucede en el punto final (no trivial para números en coma flotante cuando las cosas no siempre se dividen en el número correcto de "cortes"):

>>> np.linspace(0,1,11)
array([ 0. ,  0.1,  0.2,  0.3,  0.4,  0.5,  0.6,  0.7,  0.8,  0.9,  1. ])
>>> np.linspace(0,1,10,endpoint=False)
array([ 0. ,  0.1,  0.2,  0.3,  0.4,  0.5,  0.6,  0.7,  0.8,  0.9])

624
2018-01-25 12:26



El rango de Python () solo puede hacer enteros, no coma flotante. En su caso específico, puede usar una lista de comprensión en su lugar:

[x * 0.1 for x in range(0, 10)]

(Reemplace la llamada al rango con esa expresión).

Para el caso más general, es posible que desee escribir una función o generador personalizado.


154
2018-01-25 10:35



Sobre la base de 'xrange ([inicio], stop [, paso])', puedes definir un generador que acepte y produzca cualquier tipo que elijas (sigue los tipos que + y <)

>>> def drange(start, stop, step):
...     r = start
...     while r < stop:
...         yield r
...         r += step
...         
>>> i0=drange(0.0, 1.0, 0.1)
>>> ["%g" % x for x in i0]
['0', '0.1', '0.2', '0.3', '0.4', '0.5', '0.6', '0.7', '0.8', '0.9', '1']
>>> 

140
2018-01-25 11:57



Aumenta la magnitud de i para el ciclo y luego reducirlo cuando lo necesite.

for i * 100 in range(0, 100, 10):
    print i / 100.0

EDITAR: Honestamente, no puedo recordar por qué pensé que eso funcionaría sintácticamente

for i in range(0, 11, 1):
    print i / 10.0

Eso debería tener la salida deseada.


30
2018-01-25 10:32



scipy tiene una función incorporada arange que generaliza Python range() constructor para satisfacer su requerimiento de manejo de flotación.

from scipy import arange


20
2018-05-17 20:50



NumPy es un poco exagerado, creo.

[p/10 for p in range(0, 10)]
[0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9]

En términos generales, para hacer un paso por1/x hasta y tu harías

x=100
y=2
[p/x for p in range(0, int(x*y))]
[0.0, 0.01, 0.02, 0.03, ..., 1.97, 1.98, 1.99]

(1/x produjo menos ruido de redondeo cuando probé).


16
2018-02-28 02:06



Similar a R's  seq función, esta devuelve una secuencia en cualquier orden dado el valor de paso correcto. El último valor es igual al valor de detención.

def seq(start, stop, step=1):
    n = int(round((stop - start)/float(step)))
    if n > 1:
        return([start + step*i for i in range(n+1)])
    elif n == 1:
        return([start])
    else:
        return([])

Resultados

seq(1, 5, 0.5)

[1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0]

seq(10, 0, -1)

[10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

seq(10, 0, -2)

[10, 8, 6, 4, 2, 0]

seq(1, 1)

[1]


16
2018-06-11 19:10



La función incorporada range () devuelve una secuencia de valores enteros, me temo, por lo que no puede usarla para hacer un paso decimal.

Yo diría que solo use un ciclo while:

i = 0.0
while i <= 1.0:
    print i
    i += 0.1

Si tiene curiosidad, Python está convirtiendo su 0.1 a 0, por lo que le dice que el argumento no puede ser cero.


10
2018-01-25 10:32