Pregunta ¿Existe una función numpy que le permita especificar inicio, paso y número?


Todos estamos familiarizados con np.linspace, que crea una matriz dada una start, stopy num de elementos:

In [1]: import numpy as np

In [2]: np.linspace(0, 10, 9)
Out[2]: array([  0.  ,   1.25,   2.5 ,   3.75,   5.  ,   6.25,   7.5 ,   8.75,  10.  ])

Del mismo modo, quién podría olvidar np.arange, que crea una matriz dada una start, stopy step:

In [4]: np.arange(0, 10, 1.25)
Out[4]: array([ 0.  ,  1.25,  2.5 ,  3.75,  5.  ,  6.25,  7.5 ,  8.75])

Pero ¿hay una función que le permite especificar una start, stepy num de elementos, mientras se omite stop? Debería haber.


5
2017-08-04 21:58


origen


Respuestas:


Una respuesta eliminada señaló que linspace toma una endpoint parámetro.

Con eso, 2 ejemplos dados en otras respuestas se pueden escribir como:

In [955]: np.linspace(0, 0+(0.1*3),3,endpoint=False)
Out[955]: array([ 0. ,  0.1,  0.2])

In [956]: np.linspace(0, 0+(5*3),3,endpoint=False)
Out[956]: array([  0.,   5.,  10.])

In [957]: np.linspace(0, 0+(1.25*9),9,endpoint=False)
Out[957]: array([  0.  ,   1.25,   2.5 ,   3.75,   5.  ,   6.25,   7.5 ,   8.75,  10.  ])

Mira las funciones definidas en numpy.lib.index_tricks Para otras ideas sobre cómo generar rangos y / o grillas. Por ejemplo, np.ogrid[0:10:9j] se comporta como linspace.

def altspace(start, step, count, endpoint=False, **kwargs):
   stop = start+(step*count)
   return np.linspace(start, stop, count, endpoint=endpoint, **kwargs)

4
2017-08-04 23:12



Gracias por esa pregunta. Tuve el mismo problema. La forma más corta y elegante (desde mi perspectiva) es:

import numpy as np
start=0
step=1.25
num=9

result=np.arange(0,num)*step+start

print(result)

devoluciones

[  0.     1.25   2.5    3.75   5.     6.25   7.5    8.75  10.  ]

6
2017-07-21 08:50



def by_num_ele(start,step,n_elements):
    return numpy.arange(start,start+step*n_elements,step)

¿tal vez?


4
2017-08-04 22:01



Aquí hay uno que siempre debería funcionar con flotadores.

>>> import numpy as np
>>> import itertools
>>> def my_range(start, step, num):
...     return np.fromiter(itertools.count(start, step), np.float, num)
... 
>>> my_range(0, 0.1, 3)
array([ 0. ,  0.1,  0.2])

Podrías hacer el np.float un arg (o kwarg) si quieres usarlo con algo que no sea flotadores:

>>> import numpy as np
>>> import itertools
>>> def my_range(start, step, num, dtype=np.float):
...     return np.fromiter(itertools.count(start, step), dtype, num)
... 
>>> my_range(0, 5, 3)
array([  0.,   5.,  10.])
>>> my_range(0, 5, 3, dtype=np.int)
array([ 0,  5, 10])

1
2017-08-04 22:21