<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Thu, Jan 8, 2015 at 7:33 PM, Nathaniel Smith <span dir="ltr"><<a href="mailto:njs@pobox.com" target="_blank">njs@pobox.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><span class=""><p dir="ltr">On 9 Jan 2015 03:02, "Neil Girdhar" <<a href="mailto:mistersheik@gmail.com" target="_blank">mistersheik@gmail.com</a>> wrote:<br>
><br>
> I agree with everyone above.  At first I was +1 on this proposal, but why not suggest to the numpy people that arange and linespace should return Sequence objects rather than numpy arrays? </p></span></blockquote><div>numpy arrays are a python sequence -- what do you mean here? Did you mean iterator?</div><div><br></div><div>This whole conversation made me think a bit about numpy and iterators -- python has been moving toward more use of iterators, maybe numpy should do the same?</div><div><br></div><div>But as I think about, it's actually a totally different model -- py3 made range() an iterator, because it is most often used that way -- i.e. in a for loop or list comporehension or genator expression. when you really want the sequence, you wrap it in a list().</div><div><br></div><div>But numpy is, at it's core, about arrays, and the iteration happens INSIDE the array object. e.g. to multiply all the elements of an array by a number you do:</div><div><br></div><div>new_arr = arr * x</div><div><br></div><div>then the actual looping(iteration) happens inside numpy, with C data types, at C speed.</div><div><br></div><div>turning that into:</div><div><br></div><div>new_arr = [i*x for i in arr]</div><div><br></div><div>would push all the work back out into python, killing the point of numpy. In fact, killing BOTH points of numpy:</div><div><br></div><div>1) performance </div><div><br></div><div>2) clean readable array expressions -- that is:</div><div><br></div><div>    c = np.sqrt(a**2 + b**2)</div><div><br></div><div>    rather than:</div><div><br></div><div>    c = [ math.sqrt(x) for x in (x+y for x, y in zip( (x**2 for x in a),  (x**2 for x in b) ) ) ]</div><div><br></div><div>    OK, there may  be a more readable way to write that...</div><div><br></div><div>Anyway, numpy is about arrays, so linspace, arange, etc create arrays.</div><div><br></div><div>There may well be a good reason to make a numpy iterator version of these, for when you HAVE to loop, but that wouldn't help folks that aren't using numpy anyway.</div><div><br></div><div>but sequences (iterators) of ranges of floating point numbers (and other "numeric-like" objects) is a generally useful thing for all users of python, and not entirely trivial to do right -- hence this conversation.</div><div><br></div><div>BTW, here is an example of the OP's point about the performance hit of pulling numpy integares (or floats) out of numpy array objects:</div><div><br></div><div>using np.arange() as the source in a list comp:</div><div><br></div><div><div>In [39]: timeit a = [x**2 for x in np.arange(1000)]</div><div>1000 loops, best of 3: 907 µs per loop</div></div><div><br></div><div>compared to python xrange() - sorry, on py2 herre...</div><div><div><br></div><div><div>In [45]: In [40]: timeit a = [x**2 for x in xrange(1000)]</div><div>10000 loops, best of 3: 74.9 µs per loop</div></div></div><div><br></div><div>factor of 12 or so.</div><div><br></div><div>but really, for the most part, if you are using numpy, you're going to use numpy:</div><div><br></div><div><div>In [43]: timeit a = np.arange(1000)**2</div><div>100000 loops, best of 3: 3.99 µs per loop</div></div><div><br></div><div>another factor of 18...</div><div><br></div><div>So again, we don't ned this because numpy linspace and arrage are "slow" but because it's useful when you are not using numpy.</div><div><br></div><div><br></div><div>-Chris</div></div>-- <br><div class="gmail_signature"><br>Christopher Barker, Ph.D.<br>Oceanographer<br><br>Emergency Response Division<br>NOAA/NOS/OR&R            (206) 526-6959   voice<br>7600 Sand Point Way NE   (206) 526-6329   fax<br>Seattle, WA  98115       (206) 526-6317   main reception<br><br><a href="mailto:Chris.Barker@noaa.gov" target="_blank">Chris.Barker@noaa.gov</a></div>
</div></div>