Generating logscale ticks in python

Viewed 64

I needed to generate a list containing logscale ticks between 10^a and 10^b with a < b, however I could not find any convenience functions so far. So I went ahead and did it manually:

 # List containing 0.1, 0.2, 0.3, ..., 800, 900, 1000 
 x = np.arange(0.1, 1.0, 0.1).tolist() +
     np.arange(1, 10, 1).tolist() + 
     np.arange(10, 100, 10).tolist() + 
     np.arange(100, 1000, 100).tolist()

Is there a single method doing that?

2 Answers

That could be achieved with broadcasting -

N = 4 # number of "levels"
out = ((10**np.arange(N)[:,None])*np.arange(0.1, 1.0, 0.1)).ravel()

Another with np.linspace -

np.linspace([0.1,1,10,100],[1,10,100,1000],9, endpoint=False, axis=1).ravel()

Generalizing with N -

s = [10**i for i in range(-1,N)]
np.linspace(s[:-1],s[1:],9, endpoint=False, axis=1).ravel()

You can also use NumPy's outer product of two arrays. Here .T is for transpose to get the desired order

a = np.arange(1, 10)
# array([1, 2, 3, 4, 5, 6, 7, 8, 9])

b = np.logspace(-1, 2, 4)
# array([  0.1,   1. ,  10. , 100. ])

x = np.outer(a, b).T.flatten() # flatten is to create a 1-d array from 2-d array

# array([1.e-01, 2.e-01, 3.e-01, 4.e-01, 5.e-01, 6.e-01, 7.e-01, 8.e-01,
#        9.e-01, 1.e+00, 2.e+00, 3.e+00, 4.e+00, 5.e+00, 6.e+00, 7.e+00,
#        8.e+00, 9.e+00, 1.e+01, 2.e+01, 3.e+01, 4.e+01, 5.e+01, 6.e+01,
#        7.e+01, 8.e+01, 9.e+01, 1.e+02, 2.e+02, 3.e+02, 4.e+02, 5.e+02,
#        6.e+02, 7.e+02, 8.e+02, 9.e+02])
Related