<div dir="ltr"><div>Eric,</div><div><br></div><div>I agree these are questions that shall be answered. I think issues you raised are toward functions always make a copy -- combining them with NEVERCOPY does sound sane.<br></div><div><br></div><div>Your argument is that If the atom of the new behavior is per method, then there is no need to worry about those functions that does not sound sane when combined with NEVERCOPY.</div><div><br></div><div>Here is a proposal that may address your concerns:<br></div><div><br></div><div>1. The name of the flag does not need to be NEVERCOPY -- especially it sounds insane combined with many methods. <br></div><div> I think something like KEEPBASE may be easier to reason.</div><div> The name KEEPBASE alwsy suggests it shall not be set on an object where base is None; this feature may simplify the matter. <br></div><div><br></div><div>2. Methods that creates copy shall always create a copy, regardless of a flag -- that's the definition of copy. (np.copy)<br></div><div> KEEPBASE shall only affect methods that creates a new object object, which may reference the provided base or create a new base. <br></div><div><br></div><div>3. Functions that are not a ndarray method, shall ignore the flag, unless specified otherwise. (np.array)<br></div><br><div>4. arr + 0 when arr is KEEPBASE. It depends on if we think this triggered np.add(), or ndarray.__add__. I think ndarray.__add__ is a shortcut to call the ufunc np.add(). Thus the result of arr + 0 shall be the behavior on the ufunc np.add, which shall ignore the flag.</div><div><br></div><div>Notice that in memory tight situations, users can already use inplace operations to avoid copies. This verbose but highly controlled syntax may be preferable than inferring an automated behavior that relies on KEEPBASE of arguments.<br></div><div><br></div><div>5. I think on the operation level, the difference between subclassing(flags) and function arguments would be:</div><div> <br></div><div>array.view(keepbase=True).reshape(-1) vs array.reshape(-1, keepbase=True)</div><div><br></div><div>The gain is that no array method needs to be modified. The control can still be at the level of the algorithm.</div><div><br></div><div><br></div></div><br><div class="gmail_quote"><div dir="ltr">On Sat, Jan 12, 2019 at 11:22 PM Eric Wieser <<a href="mailto:wieser.eric%2Bnumpy@gmail.com">wieser.eric+numpy@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div class="gmail-m_-7272713219119374658markdown-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:medium none;line-height:1.2"><p style="margin:1em 0px">I don’t think a NEVERCOPY entry in <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">arr.flags</code> would make much sense.<br>Is this really a sensible limitation to put on how data gets used? Isn’t it up to the algorithm to decide whether to copy its data, not the original owner of the data?</p>
<p style="margin:1em 0px">It also leads to some tricky questions of precedence - would <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">np.array(arr, copy=True)</code> respect the flag or the argument? How about <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">np.array(arr)</code>? Is <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">arr + 0</code> considered a copy?<br>By keeping it as a value passed in via 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">copy=</code> kwarg, we don’t need to answer any of those questions.</p>
<p style="margin:1em 0px">Eric</p>
<p style="margin:1em 0px">On Thu, 10 Jan 2019 at 20:28 Ralf Gommers <a href="http://mailto:ralf.gommers@gmail.com" style="color:rgb(51,51,238);text-decoration:none" target="_blank">ralf.gommers@gmail.com</a> wrote:</p>
<p style="margin:1em 0px"></p><div class="gmail-m_-7272713219119374658markdown-here-exclude"><p></p><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div class="gmail_quote"><div dir="ltr">On Thu, Jan 10, 2019 at 11:21 AM Feng Yu <<a href="mailto:rainwoodman@gmail.com" target="_blank">rainwoodman@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div>Hi Todd,</div><div><br></div><div>I agree a flag is more suitable than classes.</div><div><br></div><div>I would add another bonus of a flag than a function argument is to avoid massive contamination of function signatures for a global variation of behavior that affects many functions. </div></div></blockquote><div><br></div></div></div><div dir="ltr"><div class="gmail_quote"><div>I like this suggestion. Copy behavior fits very nicely with existing flags (e.g. UPDATEIFCOPY, WRITEABLE) and avoids both namespace pollution and complication docstrings.</div></div></div><div dir="ltr"><div class="gmail_quote"><div><br></div><div>Ralf</div></div></div><div dir="ltr"><div class="gmail_quote"><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div></div><div><br></div><div>Yu<br></div></div><br><div class="gmail_quote"><div dir="ltr">On Wed, Jan 9, 2019 at 11:34 PM Todd <<a href="mailto:toddrjen@gmail.com" target="_blank">toddrjen@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="auto"><div><div class="gmail_quote"><div dir="ltr">On Mon, Jan 7, 2019, 14:22 Feng Yu <<a href="mailto:rainwoodman@gmail.com" target="_blank">rainwoodman@gmail.com</a> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="ltr"><div>Hi, <br></div><div><br></div><div>Was it ever brought up the possibility of a new array class (ndrefonly, ndview) that is strictly no copy?<br></div><div><br></div><div>All operations on ndrefonly will return ndrefonly and if the operation cannot be completed without making a copy, it shall throw an error.</div><div><br></div><div>On the implementation there are two choices if we use subclasses:</div><div><br></div><div>- ndrefonly can be a subclass of ndarray. The pattern would be subclass limiting functionality of super, but ndrefonly is a ndarray.<br></div><div>- ndarray as a subclass of ndarray. Subclass supplements functionality of super. : ndarray will not throw an error when a copy is necessary. However ndarray is not a ndarray.</div><div><br></div><div>If we want to be wild they do not even need to be subclasses of each other, or maybe they shall both be subclasses of something more fundamental. <br></div><div></div><div><br></div><div></div><div></div><div>- Yu</div></div></div></blockquote></div></div><div dir="auto"><br></div><div dir="auto">I would prefer a flag for this. Someone can make an array read-only by setting `arr.flags.writable=False`. So along those lines, we could have a `arr.flags.copyable` flag that if set to `False` would result in an error of any operation tried to copy the data.</div><div dir="auto"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
</blockquote></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>
_______________________________________________<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></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><p></p></div><p style="margin:1em 0px"></p>
<div title="MDH:SSBkb24ndCB0aGluayBhIE5FVkVSQ09QWSBlbnRyeSBpbiBgYXJyLmZsYWdzYCB3b3VsZCBtYWtl
IG11Y2ggc2Vuc2UuPGRpdj5JcyB0aGlzIHJlYWxseSBhIHNlbnNpYmxlIGxpbWl0YXRpb24gdG8g
cHV0IG9uIGhvdyBkYXRhIGdldHMgdXNlZD8gSXNuJ3QgaXQgdXAgdG8gdGhlIGFsZ29yaXRobSB0
byBkZWNpZGUgd2hldGhlciB0byBjb3B5IGl0cyBkYXRhLCBub3QgdGhlIG9yaWdpbmFsIG93bmVy
IG9mIHRoZSBkYXRhPzxicj48YnI+PC9kaXY+PGRpdj5JdCBhbHNvIGxlYWRzIHRvIHNvbWUgdHJp
Y2t5IHF1ZXN0aW9ucyBvZiBwcmVjZWRlbmNlIC0gd291bGQgYG5wLmFycmF5KGFyciwgY29weT1U
cnVlKWAgcmVzcGVjdCB0aGUgZmxhZyBvciB0aGUgYXJndW1lbnQ/IEhvdyBhYm91dCBgbnAuYXJy
YXkoYXJyKWA/IElzIGBhcnImbmJzcDsrIDBgIGNvbnNpZGVyZWQgYSBjb3B5PzxkaXY+PGJyPjwv
ZGl2PjxkaXY+Qnkga2VlcGluZyBpdCBhcyBhIHZhbHVlIHBhc3NlZCBpbiB2aWEgYSBgY29weT1g
IGt3YXJnLCB3ZSBkb24ndCBuZWVkIHRvIGFuc3dlciBhbnkgb2YgdGhvc2UgcXVlc3Rpb25zLjwv
ZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+RXJpYzxicj48YnI+PGRpdiBjbGFzcz0iZ21haWxfcXVv
dGUiPjxkaXYgZGlyPSJsdHIiPk9uIFRodSwgMTAgSmFuIDIwMTkgYXQgMjA6MjggUmFsZiBHb21t
ZXJzICZsdDtyYWxmLmdvbW1lcnNAZ21haWwuY29tJmd0OyB3cm90ZTo8YnI+PC9kaXY+PGJsb2Nr
cXVvdGUgY2xhc3M9ImdtYWlsX3F1b3RlIiBzdHlsZT0ibWFyZ2luOjAgMCAwIC44ZXg7Ym9yZGVy
LWxlZnQ6MXB4ICNjY2Mgc29saWQ7cGFkZGluZy1sZWZ0OjFleDsiPjxkaXYgZGlyPSJsdHIiPjxk
aXYgY2xhc3M9ImdtYWlsX3F1b3RlIj48ZGl2IGRpcj0ibHRyIj5PbiBUaHUsIEphbiAxMCwgMjAx
OSBhdCAxMToyMSBBTSBGZW5nIFl1ICZsdDs8YSBocmVmPSJtYWlsdG86cmFpbndvb2RtYW5AZ21h
aWwuY29tIiB0YXJnZXQ9Il9ibGFuayI+cmFpbndvb2RtYW5AZ21haWwuY29tPC9hPiZndDsgd3Jv
dGU6PGJyPjwvZGl2PjxibG9ja3F1b3RlIGNsYXNzPSJnbWFpbF9xdW90ZSIgc3R5bGU9Im1hcmdp
bjowcHggMHB4IDBweCAwLjhleDtib3JkZXItbGVmdDoxcHggc29saWQgcmdiKDIwNCwyMDQsMjA0
KTtwYWRkaW5nLWxlZnQ6MWV4Ij48ZGl2IGRpcj0ibHRyIj48ZGl2PkhpIFRvZGQsPC9kaXY+PGRp
dj48YnI+PC9kaXY+PGRpdj5JIGFncmVlIGEgZmxhZyBpcyBtb3JlIHN1aXRhYmxlIHRoYW4gY2xh
c3Nlcy48L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2Pkkgd291bGQgYWRkIGFub3RoZXIgYm9udXMg
b2YgYSBmbGFnIHRoYW4gYSBmdW5jdGlvbiBhcmd1bWVudCBpcyB0byBhdm9pZCBtYXNzaXZlIGNv
bnRhbWluYXRpb24gb2YgZnVuY3Rpb24gc2lnbmF0dXJlcyBmb3IgYSBnbG9iYWwgdmFyaWF0aW9u
IG9mIGJlaGF2aW9yIHRoYXQgYWZmZWN0cyBtYW55IGZ1bmN0aW9ucy4mbmJzcDs8L2Rpdj48L2Rp
dj48L2Jsb2NrcXVvdGU+PGRpdj48YnI+PC9kaXY+PC9kaXY+PC9kaXY+PGRpdiBkaXI9Imx0ciI+
PGRpdiBjbGFzcz0iZ21haWxfcXVvdGUiPjxkaXY+SSBsaWtlIHRoaXMgc3VnZ2VzdGlvbi4gQ29w
eSBiZWhhdmlvciBmaXRzIHZlcnkgbmljZWx5IHdpdGggZXhpc3RpbmcgZmxhZ3MgKGUuZy4gVVBE
QVRFSUZDT1BZLCBXUklURUFCTEUpIGFuZCBhdm9pZHMgYm90aCBuYW1lc3BhY2UgcG9sbHV0aW9u
IGFuZCBjb21wbGljYXRpb24gZG9jc3RyaW5ncy48L2Rpdj48L2Rpdj48L2Rpdj48ZGl2IGRpcj0i
bHRyIj48ZGl2IGNsYXNzPSJnbWFpbF9xdW90ZSI+PGRpdj48YnI+PC9kaXY+PGRpdj5SYWxmPC9k
aXY+PC9kaXY+PC9kaXY+PGRpdiBkaXI9Imx0ciI+PGRpdiBjbGFzcz0iZ21haWxfcXVvdGUiPjxk
aXY+PGJyPjwvZGl2PjxibG9ja3F1b3RlIGNsYXNzPSJnbWFpbF9xdW90ZSIgc3R5bGU9Im1hcmdp
bjowcHggMHB4IDBweCAwLjhleDtib3JkZXItbGVmdDoxcHggc29saWQgcmdiKDIwNCwyMDQsMjA0
KTtwYWRkaW5nLWxlZnQ6MWV4Ij48ZGl2IGRpcj0ibHRyIj48ZGl2PjwvZGl2PjxkaXY+PGJyPjwv
ZGl2PjxkaXY+WXU8YnI+PC9kaXY+PC9kaXY+PGJyPjxkaXYgY2xhc3M9ImdtYWlsX3F1b3RlIj48
ZGl2IGRpcj0ibHRyIj5PbiBXZWQsIEphbiA5LCAyMDE5IGF0IDExOjM0IFBNIFRvZGQgJmx0Ozxh
IGhyZWY9Im1haWx0bzp0b2RkcmplbkBnbWFpbC5jb20iIHRhcmdldD0iX2JsYW5rIj50b2Rkcmpl
bkBnbWFpbC5jb208L2E+Jmd0OyB3cm90ZTo8YnI+PC9kaXY+PGJsb2NrcXVvdGUgY2xhc3M9Imdt
YWlsX3F1b3RlIiBzdHlsZT0ibWFyZ2luOjBweCAwcHggMHB4IDAuOGV4O2JvcmRlci1sZWZ0OjFw
eCBzb2xpZCByZ2IoMjA0LDIwNCwyMDQpO3BhZGRpbmctbGVmdDoxZXgiPjxkaXYgZGlyPSJhdXRv
Ij48ZGl2PjxkaXYgY2xhc3M9ImdtYWlsX3F1b3RlIj48ZGl2IGRpcj0ibHRyIj5PbiBNb24sIEph
biA3LCAyMDE5LCAxNDoyMiBGZW5nIFl1ICZsdDs8YSBocmVmPSJtYWlsdG86cmFpbndvb2RtYW5A
Z21haWwuY29tIiB0YXJnZXQ9Il9ibGFuayI+cmFpbndvb2RtYW5AZ21haWwuY29tPC9hPiB3cm90
ZTo8YnI+PC9kaXY+PGJsb2NrcXVvdGUgY2xhc3M9ImdtYWlsX3F1b3RlIiBzdHlsZT0ibWFyZ2lu
OjBweCAwcHggMHB4IDAuOGV4O2JvcmRlci1sZWZ0OjFweCBzb2xpZCByZ2IoMjA0LDIwNCwyMDQp
O3BhZGRpbmctbGVmdDoxZXgiPjxkaXYgZGlyPSJsdHIiPjxkaXYgZGlyPSJsdHIiPjxkaXY+SGks
IDxicj48L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2PldhcyBpdCBldmVyIGJyb3VnaHQgdXAgdGhl
IHBvc3NpYmlsaXR5IG9mIGEgbmV3IGFycmF5IGNsYXNzIChuZHJlZm9ubHksIG5kdmlldykgdGhh
dCBpcyBzdHJpY3RseSBubyBjb3B5Pzxicj48L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2PkFsbCBv
cGVyYXRpb25zIG9uIG5kcmVmb25seSB3aWxsIHJldHVybiBuZHJlZm9ubHkgYW5kIGlmIHRoZSBv
cGVyYXRpb24gY2Fubm90IGJlIGNvbXBsZXRlZCB3aXRob3V0IG1ha2luZyBhIGNvcHksIGl0IHNo
YWxsIHRocm93IGFuIGVycm9yLjwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+T24gdGhlIGltcGxl
bWVudGF0aW9uIHRoZXJlIGFyZSB0d28gY2hvaWNlcyBpZiB3ZSB1c2Ugc3ViY2xhc3Nlczo8L2Rp
dj48ZGl2Pjxicj48L2Rpdj48ZGl2Pi0gbmRyZWZvbmx5IGNhbiBiZSBhIHN1YmNsYXNzIG9mIG5k
YXJyYXkuIFRoZSBwYXR0ZXJuIHdvdWxkIGJlIHN1YmNsYXNzIGxpbWl0aW5nIGZ1bmN0aW9uYWxp
dHkgb2Ygc3VwZXIsIGJ1dCBuZHJlZm9ubHkgaXMgYSBuZGFycmF5Ljxicj48L2Rpdj48ZGl2Pi0g
bmRhcnJheSBhcyBhIHN1YmNsYXNzIG9mIG5kYXJyYXkuIFN1YmNsYXNzIHN1cHBsZW1lbnRzIGZ1
bmN0aW9uYWxpdHkgb2Ygc3VwZXIuIDogbmRhcnJheSB3aWxsIG5vdCB0aHJvdyBhbiBlcnJvciB3
aGVuIGEgY29weSBpcyBuZWNlc3NhcnkuIEhvd2V2ZXIgbmRhcnJheSBpcyBub3QgYSBuZGFycmF5
LjwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+SWYgd2Ugd2FudCB0byBiZSB3aWxkIHRoZXkgZG8g
bm90IGV2ZW4gbmVlZCB0byBiZSBzdWJjbGFzc2VzIG9mIGVhY2ggb3RoZXIsIG9yIG1heWJlIHRo
ZXkgc2hhbGwgYm90aCBiZSBzdWJjbGFzc2VzIG9mIHNvbWV0aGluZyBtb3JlIGZ1bmRhbWVudGFs
LiA8YnI+PC9kaXY+PGRpdj48L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2PjwvZGl2PjxkaXY+PC9k
aXY+PGRpdj4tIFl1PC9kaXY+PC9kaXY+PC9kaXY+PC9ibG9ja3F1b3RlPjwvZGl2PjwvZGl2Pjxk
aXYgZGlyPSJhdXRvIj48YnI+PC9kaXY+PGRpdiBkaXI9ImF1dG8iPkkgd291bGQgcHJlZmVyIGEg
ZmxhZyBmb3IgdGhpcy4mbmJzcDsgU29tZW9uZSBjYW4gbWFrZSBhbiBhcnJheSByZWFkLW9ubHkg
Ynkgc2V0dGluZyBgYXJyLmZsYWdzLndyaXRhYmxlPUZhbHNlYC4mbmJzcDsgU28gYWxvbmcgdGhv
c2UgbGluZXMsIHdlIGNvdWxkIGhhdmUgYSBgYXJyLmZsYWdzLmNvcHlhYmxlYCBmbGFnIHRoYXQg
aWYgc2V0IHRvIGBGYWxzZWAgd291bGQgcmVzdWx0IGluIGFuIGVycm9yIG9mIGFueSBvcGVyYXRp
b24gdHJpZWQgdG8gY29weSB0aGUgZGF0YS48L2Rpdj48ZGl2IGRpcj0iYXV0byI+PGRpdiBjbGFz
cz0iZ21haWxfcXVvdGUiPjxibG9ja3F1b3RlIGNsYXNzPSJnbWFpbF9xdW90ZSIgc3R5bGU9Im1h
cmdpbjowcHggMHB4IDBweCAwLjhleDtib3JkZXItbGVmdDoxcHggc29saWQgcmdiKDIwNCwyMDQs
MjA0KTtwYWRkaW5nLWxlZnQ6MWV4Ij4KPC9ibG9ja3F1b3RlPjwvZGl2PjwvZGl2PjwvZGl2Pgpf
X19fX19fX19fX19fX19fX19fX19fX19fX19fX188d2JyPl9fX19fX19fX19fX19fX19fPGJyPgpO
dW1QeS1EaXNjdXNzaW9uIG1haWxpbmcgbGlzdDxicj4KPGEgaHJlZj0ibWFpbHRvOk51bVB5LURp
c2N1c3Npb25AcHl0aG9uLm9yZyIgdGFyZ2V0PSJfYmxhbmsiPk51bVB5LURpc2N1c3Npb25AcHl0
aG9uLm9yZzwvYT48YnI+CjxhIGhyZWY9Imh0dHBzOi8vbWFpbC5weXRob24ub3JnL21haWxtYW4v
bGlzdGluZm8vbnVtcHktZGlzY3Vzc2lvbiIgcmVsPSJub3JlZmVycmVyIiB0YXJnZXQ9Il9ibGFu
ayIgZGF0YS1zYWZlcmVkaXJlY3R1cmw9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vdXJsP3E9aHR0
cHM6Ly9tYWlsLnB5dGhvbi5vcmcvbWFpbG1hbi9saXN0aW5mby9udW1weS1kaXNjdXNzaW9uJmFt
cDtzb3VyY2U9Z21haWwmYW1wO3VzdD0xNTQ3NDQ5ODk3NDM2MDAwJmFtcDt1c2c9QUZRakNOSDVj
TnNqUjBIRHdnOUk1aHJfeWl3TVB0TzRNdyI+aHR0cHM6Ly9tYWlsLnB5dGhvbi5vcmcvPHdicj5t
YWlsbWFuL2xpc3RpbmZvL251bXB5LTx3YnI+ZGlzY3Vzc2lvbjwvYT48YnI+CjwvYmxvY2txdW90
ZT48L2Rpdj4KX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fPHdicj5fX19fX19fX19fX19f
X19fXzxicj4KTnVtUHktRGlzY3Vzc2lvbiBtYWlsaW5nIGxpc3Q8YnI+CjxhIGhyZWY9Im1haWx0
bzpOdW1QeS1EaXNjdXNzaW9uQHB5dGhvbi5vcmciIHRhcmdldD0iX2JsYW5rIj5OdW1QeS1EaXNj
dXNzaW9uQHB5dGhvbi5vcmc8L2E+PGJyPgo8YSBocmVmPSJodHRwczovL21haWwucHl0aG9uLm9y
Zy9tYWlsbWFuL2xpc3RpbmZvL251bXB5LWRpc2N1c3Npb24iIHJlbD0ibm9yZWZlcnJlciIgdGFy
Z2V0PSJfYmxhbmsiIGRhdGEtc2FmZXJlZGlyZWN0dXJsPSJodHRwczovL3d3dy5nb29nbGUuY29t
L3VybD9xPWh0dHBzOi8vbWFpbC5weXRob24ub3JnL21haWxtYW4vbGlzdGluZm8vbnVtcHktZGlz
Y3Vzc2lvbiZhbXA7c291cmNlPWdtYWlsJmFtcDt1c3Q9MTU0NzQ0OTg5NzQzNjAwMCZhbXA7dXNn
PUFGUWpDTkg1Y05zalIwSER3ZzlJNWhyX3lpd01QdE80TXciPmh0dHBzOi8vbWFpbC5weXRob24u
b3JnLzx3YnI+bWFpbG1hbi9saXN0aW5mby9udW1weS08d2JyPmRpc2N1c3Npb248L2E+PGJyPgo8
L2Jsb2NrcXVvdGU+PC9kaXY+PC9kaXY+Cl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fXzx3
YnI+X19fX19fX19fX19fX19fX188YnI+Ck51bVB5LURpc2N1c3Npb24gbWFpbGluZyBsaXN0PGJy
Pgo8YSBocmVmPSJtYWlsdG86TnVtUHktRGlzY3Vzc2lvbkBweXRob24ub3JnIiB0YXJnZXQ9Il9i
bGFuayI+TnVtUHktRGlzY3Vzc2lvbkBweXRob24ub3JnPC9hPjxicj4KPGEgaHJlZj0iaHR0cHM6
Ly9tYWlsLnB5dGhvbi5vcmcvbWFpbG1hbi9saXN0aW5mby9udW1weS1kaXNjdXNzaW9uIiByZWw9
Im5vcmVmZXJyZXIiIHRhcmdldD0iX2JsYW5rIiBkYXRhLXNhZmVyZWRpcmVjdHVybD0iaHR0cHM6
Ly93d3cuZ29vZ2xlLmNvbS91cmw/cT1odHRwczovL21haWwucHl0aG9uLm9yZy9tYWlsbWFuL2xp
c3RpbmZvL251bXB5LWRpc2N1c3Npb24mYW1wO3NvdXJjZT1nbWFpbCZhbXA7dXN0PTE1NDc0NDk4
OTc0MzYwMDAmYW1wO3VzZz1BRlFqQ05INWNOc2pSMEhEd2c5STVocl95aXdNUHRPNE13Ij5odHRw
czovL21haWwucHl0aG9uLm9yZy9tYWlsbWE8d2JyPm4vbGlzdGluZm8vbnVtcHktZGlzY3Vzc2lv
bjwvYT48YnI+CjwvYmxvY2txdW90ZT48L2Rpdj48L2Rpdj48L2Rpdj4=" style="height:0px;width:0px;max-height:0px;max-width:0px;overflow:hidden;font-size:0em;padding:0px;margin:0px"></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>