18

Numpy linspace returns evenly spaced numbers over a specified interval. Numpy logspace return numbers spaced evenly on a log scale.

I don't understand why numpy logspace often returns values "out of range" from the bounds I set. Take numbers between 0.02 and 2.0:

import numpy as np
print np.linspace(0.02, 2.0, num=20)
print np.logspace(0.02, 2.0, num=20)

The output for the first is:

[ 0.02        0.12421053  0.22842105  0.33263158  0.43684211  0.54105263
  0.64526316  0.74947368  0.85368421  0.95789474  1.06210526  1.16631579
  1.27052632  1.37473684  1.47894737  1.58315789  1.68736842  1.79157895
  1.89578947  2.        ]

That looks correct. However, the output for np.logspace() is wrong:

[   1.04712855    1.33109952    1.69208062    2.15095626    2.73427446
    3.47578281    4.41838095    5.61660244    7.13976982    9.07600522
   11.53732863   14.66613875   18.64345144   23.69937223   30.12640904
   38.29639507   48.68200101   61.88408121   78.6664358   100.        ]

Why does it output 1.047 to 100.0?

4 Answers 4

30

2017 update: The numpy 1.12 includes a function that does exactly what the original question asked, i.e. returns a range between two values evenly sampled in log space.

The function is numpy.geomspace

>>> np.geomspace(0.02, 2.0, 20)
array([ 0.02      ,  0.0254855 ,  0.03247553,  0.04138276,  0.05273302,
        0.06719637,  0.08562665,  0.1091119 ,  0.13903856,  0.17717336,
        0.22576758,  0.28768998,  0.36659614,  0.46714429,  0.59527029,
        0.75853804,  0.96658605,  1.23169642,  1.56951994,  2.        ])
Sign up to request clarification or add additional context in comments.

1 Comment

Thanks...this is exactly what I was looking for to get a range that goes from dense to sparse
21

logspace computes its start and end points as base**start and base**stop respectively. The base value can be specified, but is 10.0 by default.

For your example you have a start value of 10**0.02 == 1.047 and a stop value of 10**2 == 100.

You could use the following parameters (calculated with np.log10) instead:

>>> np.logspace(np.log10(0.02) , np.log10(2.0) , num=20)
array([ 0.02      ,  0.0254855 ,  0.03247553,  0.04138276,  0.05273302,
        0.06719637,  0.08562665,  0.1091119 ,  0.13903856,  0.17717336,
        0.22576758,  0.28768998,  0.36659614,  0.46714429,  0.59527029,
        0.75853804,  0.96658605,  1.23169642,  1.56951994,  2.        ])

Comments

4

From documentation for numpy.logspace() -

numpy.logspace(start, stop, num=50, endpoint=True, base=10.0, dtype=None)

Return numbers spaced evenly on a log scale.

In linear space, the sequence starts at base ** start (base to the power of start) and ends with base ** stop (see endpoint below).

For your case, base is defaulting to 10, so its going from 10 raised to 0.02 to 10 raised to 2 (100).

Comments

3

This is pretty simple.

NumPy gives you numbers evenly distributed in log space.

i.e. 10^(value). where value is evenly spaced between your start and stop values.

You'll note 10^0.02 is 1.04712 ... and 10^2 is 100

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.