<div dir="ltr"><div dir="ltr"><div>Eric, interesting ideas.</div><div><br></div><div>> <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:nowrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">__getitem__(Tuple[int])</code> which returns numpy scalars</div><div><br></div><div>I'm not sure what you mean. Even if you supply a numpy uint8 to range, it still returns a python int class. <br></div><div>Would you like ndrange to return a tuple of `uint8` in this case?<br></div><div><br></div><div>```</div><div>In [3]: a = iter(range(np.uint8(10)))                                           <br><br>In [4]: next(a).__class__                                                       <br>Out[4]: int<br><br>In [5]: np.uint8(10).__class__                                                  <br>Out[5]: numpy.uint8<br></div><div>```</div><div><br></div><div>Ravel seems like a cool way to choose iteration order. In the PR, I mentionned that one reason that I removed `'F'` order from the PR was:<br></div><div>1. My implementation was not competitive with the `C` order implementation in terms of speed (can be fixed)<br></div><div>2. I don't know if it something that people really need to iterate over collections (annoying to maintain if unused)<br></div><div><br></div><div>Instead, I just showed an example how people could iterate in `F` order should they need to.</div><div><br></div><div>I'm not sure if we ever want the `ndrange` object to return a full matrix. It seems like we would be creating a custom tuple class just for this which seems pretty niche.</div><div><br></div></div></div><br><div class="gmail_quote"><div dir="ltr">On Thu, Oct 11, 2018 at 10:21 AM Eric Wieser <<a href="mailto:wieser.eric%2Bnumpy@gmail.com" target="_blank">wieser.eric+numpy@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div class="m_3143987662236259795m_2391981580334972470markdown-here-wrapper" style="font-size:1em;font-family:Helvetica,arial,freesans,clean,sans-serif;color:rgb(34,34,34);background-color:rgb(255,255,255);border:none;line-height:1.2"><blockquote style="margin:1em 0px;border-left:4px solid rgb(221,221,221);padding:0px 1em;color:rgb(119,119,119);quotes:none">
<p style="margin:1em 0px">Isn’t that what arange is for?</p>
</blockquote>
<p style="margin:1em 0px">Imagining ourselves in python2 land for now - I’m proposing <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:nowrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">arange</code> is to <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:nowrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">range</code>, as <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:nowrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">ndrange</code> is to <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:nowrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">xrange</code>  </p>
<blockquote style="margin:1em 0px;border-left:4px solid rgb(221,221,221);padding:0px 1em;color:rgb(119,119,119);quotes:none">
<p style="margin:1em 0px">I’m not convinced it should return an ndarray </p>
</blockquote>
<p style="margin:1em 0px">I agree - I think it should return a range-like object that:</p>
<ul style="padding-left:2em;margin:1em 0px">
<li style="margin:1em 0px">Is convertible via <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:nowrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">__array__</code> if needed</li>
<li style="margin:1em 0px">Looks like an ndarray, with:<ul style="padding-left:2em;margin:1em 0px">
<li style="margin:1em 0px">a <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:nowrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">.dtype</code> attribute</li>
<li style="margin:1em 0px">a <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:nowrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">__getitem__(Tuple[int])</code> which returns numpy scalars</li>
<li style="margin:1em 0px"><code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:nowrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">.ravel()</code> and <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:nowrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">.flat</code> for choosing iteration order.</li>
</ul>
</li>
</ul>
<p style="margin:1em 0px">On Wed, 10 Oct 2018 at 11:21 Allan Haldane <a href="http://mailto:allanhaldane@gmail.com" style="color:rgb(51,51,238);text-decoration:none" target="_blank">allanhaldane@gmail.com</a> wrote:</p>
<p style="margin:1em 0px"></p><div class="m_3143987662236259795m_2391981580334972470markdown-here-exclude"><p></p><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On 10/10/18 12:34 AM, Eric Wieser wrote:<br>
> One thing that worries me here - in python, |range(...)| in essence<br>
> generates a lazy |list| - so I’d expect |ndrange| to generate a lazy<br>
> |ndarray|. In practice, that means it would be a duck-type defining an<br>
> |__array__| method to evaluate it, and only implement methods already<br>
> present in numpy.<br>
<br>
Isn't that what arange is for?<br>
<br>
It seems like there are two uses of python3's range: 1. creating a 1d<br>
iterable of indices for use in for-loops, and 2. with list(range) can be<br>
used to create a sequence of integers.<br>
<br>
Numpy can extend this in two directions:<br>
 * ndrange returns an iterable of nd indices (for for-loops).<br>
 * arange returns an 1d ndarray of integers instead of a list<br>
<br>
The application of for-loops, which is more niche, doesn't need<br>
ndarray's vectorized properties, so I'm not convinced it should return<br>
an ndarray. It certainly seems simpler not to return an ndarray, due to<br>
the dtype question.<br>
<br>
arange on its own seems to cover the need for a vectorized version of range.<br>
<br>
Allan<br>
_______________________________________________<br>
NumPy-Discussion mailing list<br>
<a href="mailto:NumPy-Discussion@python.org" target="_blank">NumPy-Discussion@python.org</a><br>
<a href="https://mail.python.org/mailman/listinfo/numpy-discussion" rel="noreferrer" target="_blank">https://mail.python.org/mailman/listinfo/numpy-discussion</a><br>
</blockquote><p></p></div><p style="margin:1em 0px"></p>
<div title="MDH:PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZTogMTNweDsiPiZndDsmbmJzcDs8L3NwYW4+PHNwYW4gc3R5
bGU9ImZvbnQtc2l6ZTogMTNweDsgY29sb3I6IHJnYigzMywgMzMsIDMzKTsiPklzbid0IHRoYXQg
d2hhdCBhcmFuZ2UgaXMgZm9yPzxicj48YnI+SW1hZ2luaW5nIG91cnNlbHZlcyBpbiBweXRob24y
IGxhbmQgZm9yIG5vdyAtIEknbSBwcm9wb3NpbmcgYGFyYW5nZWAgaXMgdG8gYHJhbmdlYCwgYXMg
YG5kcmFuZ2VgIGlzIHRvIGB4cmFuZ2VgPC9zcGFuPsKgwqA8ZGl2Pjxicj48L2Rpdj48ZGl2PiZn
dDsgSSdtIG5vdCBjb252aW5jZWQgaXQgc2hvdWxkIHJldHVybiBhbiBuZGFycmF5Jm5ic3A7PGJy
Pjxicj5JIGFncmVlIC0gSSB0aGluayBpdCBzaG91bGQgcmV0dXJuIGEgcmFuZ2UtbGlrZSBvYmpl
Y3QgdGhhdDo8L2Rpdj48ZGl2PiogSXMgY29udmVydGlibGUgdmlhIGBfX2FycmF5X19gIGlmIG5l
ZWRlZDwvZGl2PjxkaXY+KiBMb29rcyBsaWtlIGFuIG5kYXJyYXksIHdpdGg6PGJyPiZuYnNwOyog
YSBgLmR0eXBlYCBhdHRyaWJ1dGU8L2Rpdj48ZGl2PiZuYnNwOyogYSBgX19nZXRpdGVtX18oVHVw
bGVbaW50XSlgIHdoaWNoIHJldHVybnMgbnVtcHkgc2NhbGFyczwvZGl2PjxkaXY+Jm5ic3A7KiBg
LnJhdmVsKClgIGFuZCBgLmZsYXRgIGZvciBjaG9vc2luZyBpdGVyYXRpb24gb3JkZXIuPGJyPjxi
cj48ZGl2IGNsYXNzPSJnbWFpbF9xdW90ZSI+PGRpdiBkaXI9Imx0ciI+T24gV2VkLCAxMCBPY3Qg
MjAxOCBhdCAxMToyMSBBbGxhbiBIYWxkYW5lICZsdDthbGxhbmhhbGRhbmVAZ21haWwuY29tJmd0
OyB3cm90ZTo8YnI+PC9kaXY+PGJsb2NrcXVvdGUgY2xhc3M9ImdtYWlsX3F1b3RlIiBzdHlsZT0i
bWFyZ2luOjAgMCAwIC44ZXg7Ym9yZGVyLWxlZnQ6MXB4ICNjY2Mgc29saWQ7cGFkZGluZy1sZWZ0
OjFleDsiPk9uIDEwLzEwLzE4IDEyOjM0IEFNLCBFcmljIFdpZXNlciB3cm90ZTo8YnI+CiZndDsg
T25lIHRoaW5nIHRoYXQgd29ycmllcyBtZSBoZXJlIC0gaW4gcHl0aG9uLCB8cmFuZ2UoLi4uKXwg
aW4gZXNzZW5jZTxicj4KJmd0OyBnZW5lcmF0ZXMgYSBsYXp5IHxsaXN0fCAtIHNvIEnigJlkIGV4
cGVjdCB8bmRyYW5nZXwgdG8gZ2VuZXJhdGUgYSBsYXp5PGJyPgomZ3Q7IHxuZGFycmF5fC4gSW4g
cHJhY3RpY2UsIHRoYXQgbWVhbnMgaXQgd291bGQgYmUgYSBkdWNrLXR5cGUgZGVmaW5pbmcgYW48
YnI+CiZndDsgfF9fYXJyYXlfX3wgbWV0aG9kIHRvIGV2YWx1YXRlIGl0LCBhbmQgb25seSBpbXBs
ZW1lbnQgbWV0aG9kcyBhbHJlYWR5PGJyPgomZ3Q7IHByZXNlbnQgaW4gbnVtcHkuPGJyPgo8YnI+
Cklzbid0IHRoYXQgd2hhdCBhcmFuZ2UgaXMgZm9yPzxicj4KPGJyPgpJdCBzZWVtcyBsaWtlIHRo
ZXJlIGFyZSB0d28gdXNlcyBvZiBweXRob24zJ3MgcmFuZ2U6IDEuIGNyZWF0aW5nIGEgMWQ8YnI+
Cml0ZXJhYmxlIG9mIGluZGljZXMgZm9yIHVzZSBpbiBmb3ItbG9vcHMsIGFuZCAyLiB3aXRoIGxp
c3QocmFuZ2UpIGNhbiBiZTxicj4KdXNlZCB0byBjcmVhdGUgYSBzZXF1ZW5jZSBvZiBpbnRlZ2Vy
cy48YnI+Cjxicj4KTnVtcHkgY2FuIGV4dGVuZCB0aGlzIGluIHR3byBkaXJlY3Rpb25zOjxicj4K
Jm5ic3A7KiBuZHJhbmdlIHJldHVybnMgYW4gaXRlcmFibGUgb2YgbmQgaW5kaWNlcyAoZm9yIGZv
ci1sb29wcykuPGJyPgombmJzcDsqIGFyYW5nZSByZXR1cm5zIGFuIDFkIG5kYXJyYXkgb2YgaW50
ZWdlcnMgaW5zdGVhZCBvZiBhIGxpc3Q8YnI+Cjxicj4KVGhlIGFwcGxpY2F0aW9uIG9mIGZvci1s
b29wcywgd2hpY2ggaXMgbW9yZSBuaWNoZSwgZG9lc24ndCBuZWVkPGJyPgpuZGFycmF5J3MgdmVj
dG9yaXplZCBwcm9wZXJ0aWVzLCBzbyBJJ20gbm90IGNvbnZpbmNlZCBpdCBzaG91bGQgcmV0dXJu
PGJyPgphbiBuZGFycmF5LiBJdCBjZXJ0YWlubHkgc2VlbXMgc2ltcGxlciBub3QgdG8gcmV0dXJu
IGFuIG5kYXJyYXksIGR1ZSB0bzxicj4KdGhlIGR0eXBlIHF1ZXN0aW9uLjxicj4KPGJyPgphcmFu
Z2Ugb24gaXRzIG93biBzZWVtcyB0byBjb3ZlciB0aGUgbmVlZCBmb3IgYSB2ZWN0b3JpemVkIHZl
cnNpb24gb2YgcmFuZ2UuPGJyPgo8YnI+CkFsbGFuPGJyPgpfX19fX19fX19fX19fX19fX19fX19f
X19fX19fX188d2JyPl9fX19fX19fX19fX19fX19fPGJyPgpOdW1QeS1EaXNjdXNzaW9uIG1haWxp
bmcgbGlzdDxicj4KPGEgaHJlZj0ibWFpbHRvOk51bVB5LURpc2N1c3Npb25AcHl0aG9uLm9yZyIg
dGFyZ2V0PSJfYmxhbmsiPk51bVB5LURpc2N1c3Npb25AcHl0aG9uLm9yZzwvYT48YnI+CjxhIGhy
ZWY9Imh0dHBzOi8vbWFpbC5weXRob24ub3JnL21haWxtYW4vbGlzdGluZm8vbnVtcHktZGlzY3Vz
c2lvbiIgcmVsPSJub3JlZmVycmVyIiB0YXJnZXQ9Il9ibGFuayIgZGF0YS1zYWZlcmVkaXJlY3R1
cmw9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vdXJsP3E9aHR0cHM6Ly9tYWlsLnB5dGhvbi5vcmcv
bWFpbG1hbi9saXN0aW5mby9udW1weS1kaXNjdXNzaW9uJmFtcDtzb3VyY2U9Z21haWwmYW1wO3Vz
dD0xNTM5MzUxNDgxODgxMDAwJmFtcDt1c2c9QUZRakNOSEFLS1ZGSjRJS01zUEg1cVhoRE9nUjZo
ZWl3ZyI+aHR0cHM6Ly9tYWlsLnB5dGhvbi5vcmcvbWFpbG1hPHdicj5uL2xpc3RpbmZvL251bXB5
LWRpc2N1c3Npb248L2E+PGJyPgo8L2Jsb2NrcXVvdGU+PC9kaXY+PC9kaXY+" style="height:0;width:0;max-height:0;max-width:0;overflow:hidden;font-size:0em;padding:0;margin:0">​</div></div></div>
_______________________________________________<br>
NumPy-Discussion mailing list<br>
<a href="mailto:NumPy-Discussion@python.org" target="_blank">NumPy-Discussion@python.org</a><br>
<a href="https://mail.python.org/mailman/listinfo/numpy-discussion" rel="noreferrer" target="_blank">https://mail.python.org/mailman/listinfo/numpy-discussion</a><br>
</blockquote></div>