[Numpy-tickets] [NumPy] #264: linspace endpoint not always honored

NumPy numpy-tickets at scipy.net
Mon Aug 21 11:39:44 CDT 2006


#264: linspace endpoint not always honored
-----------------------+----------------------------------------------------
 Reporter:  baxissimo  |       Owner:  somebody
     Type:  defect     |      Status:  new     
 Priority:  normal     |   Milestone:          
Component:  numpy.lib  |     Version:          
 Severity:  normal     |    Keywords:          
-----------------------+----------------------------------------------------
 It is not always the case that
    linspace(start,stop,num)[-1] == stop

 The following little example should output [], but it doesn't.
 {{{
 In [390]: filter(lambda x: x[1]!=0.0, [ (i, 1.0-numpy.linspace(0,1,i)[-1])
 for i in range(2,200) ])
 Out[390]:
 [(50, 1.1102230246251565e-016),
  (99, 1.1102230246251565e-016),
  (104, 1.1102230246251565e-016),
  (108, 1.1102230246251565e-016),
  (162, 1.1102230246251565e-016),
  (188, 1.1102230246251565e-016),
  (197, 1.1102230246251565e-016),
  (198, 1.1102230246251565e-016)]
 }}}

 I know it's not a good idea to count on floating point equality in
 general, but it doesn't seem too much to expect that the first and last
 values returned by linspace are exactly the values asked for if they both
 have exact floating point representations.

 The simplest fix is to just add in a
 {{{
    y[-1] = stop
 }}}
 in the case of endpoint=True.  So the code would become

 {{{
 def linspace(start, stop, num=50, endpoint=True, retstep=False):
    """Return evenly spaced numbers.

    Return 'num' evenly spaced samples from 'start' to 'stop'.  If
    'endpoint' is True, the last sample is 'stop'. If 'retstep' is
    True then return the step value used.
    """
    num = int(num)
    if num <= 0:
        return array([], float)
    if endpoint:
        if num == 1:
            return array([float(start)])
        step = (stop-start)/float((num-1))
        y = _nx.arange(0, num) * step + start
        y[-1] = float(stop)
    else:
        step = (stop-start)/float(num)
        y = _nx.arange(0, num) * step + start
    if retstep:
        return y, step
    else:
        return y
 }}}

 Note, the above change would have the effect of making
 linspace(start,stop,1) return stop, rather than start.  If this is
 considered undesirable, it's a simple matter to special case the num==1
 case for backwards compatibility.  I.e.
 {{{
    if num>1: y[-1] = float(stop)
 }}}

-- 
Ticket URL: <http://projects.scipy.org/scipy/numpy/ticket/264>
NumPy <http://projects.scipy.org/scipy/numpy>
The fundamental package needed for scientific computing with Python.


More information about the Numpy-tickets mailing list