<div dir="ltr"><div class="markdown-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">which ensure that it is still well defined (as the identity) on 1d arrays. </p>
</blockquote>
<p style="margin:1em 0px">This strikes me as a bad idea. There’s already enough confusion from beginners that <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_1d.T</code>  is a no-op. If we introduce a matrix-transpose, it should either error on <1d inputs with a useful message, or insert the extra dimension. I’d favor the former.</p>
<p style="margin:1em 0px">Eric</p>
<p style="margin:1em 0px">On Mon, 28 May 2018 at 16:27 Stephan Hoyer <a href="http://mailto:shoyer@gmail.com" style="color:rgb(51,51,238);text-decoration:none">shoyer@gmail.com</a> wrote:</p>
<p style="margin:1em 0px"></p><div class="markdown-here-exclude"><p></p><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div class="gmail_quote"><div dir="ltr">On Mon, May 21, 2018 at 5:42 PM Matti Picus <<a href="mailto:matti.picus@gmail.com" target="_blank">matti.picus@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">- create a wrapper that can convince the ufunc mechanism to call <br>
__array_ufunc__ even on functions that are not true ufuncs<br></blockquote><div><br></div></div></div><div dir="ltr"><div class="gmail_quote"><div>I am somewhat opposed to this approach, because __array_ufunc__ is about overloading ufuncs, and as soon as we relax this guarantee the set of invariants __array_ufunc__ implementors rely on becomes much more limited.</div><div><br></div><div>We really should have another mechanism for arbitrary function overloading in NumPy (NEP to follow shortly!).</div></div></div><div dir="ltr"><div class="gmail_quote"><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
- expand the semantics of core signatures so that a single matmul ufunc <br>
can implement matrix-matrix, vector-matrix, matrix-vector, and <br>
vector-vector multiplication.</blockquote><div><br></div></div></div><div dir="ltr"><div class="gmail_quote"><div>I was initially concerned that adding optional dimensions for gufuncs would introduce additional complexity for only the benefit of a single function (matmul), but I'm now convinced that it makes sense:</div><div>1. All other arithmetic overloads use __array_ufunc__, and it would be nice to keep @/matmul in the same place.</div><div>2. There's a common family of gufuncs for which optional dimensions like np.matmul make sense: matrix functions where 1D arrays should be treated as 2D row- or column-vectors.</div><div><br></div><div>One example of this class of behavior would be np.linalg.solve, which could support vectors like Ax=b and matrices like Ax=B with the signature (m,m),(m,n?)->(m,n?). We couldn't immediately make np.linalg.solve a gufunc since it uses a subtly different dispatching rule, but it's the same use-case.</div><div><br></div><div>Another example would be the "matrix transpose" function that has been occasionally proposed, to swap the last two dimensions of an array. It could have the signature (m?,n)->(n,m?), which ensure that it is still well defined (as the identity) on 1d arrays.</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><p></p></div><p style="margin:1em 0px"></p>
<div title="MDH:Jmd0O8KgPHNwYW4gc3R5bGU9ImNvbG9yOiByZ2IoMzMsIDMzLCAzMyk7IGZvbnQtc2l6ZTogMTNw
eDsiPndoaWNoIGVuc3VyZSB0aGF0IGl0IGlzIHN0aWxsIHdlbGwgZGVmaW5lZCAoYXMgdGhlIGlk
ZW50aXR5KSBvbiAxZCBhcnJheXMuPC9zcGFuPsKgPGJyPjxicj5UaGlzIHN0cmlrZXMgbWUgYXMg
YSBiYWQgaWRlYS4gVGhlcmUncyBhbHJlYWR5IGVub3VnaCBjb25mdXNpb24gZnJvbSBiZWdpbm5l
cnMgdGhhdCBgYXJyYXlfMWQuVGDCoCBpcyBhIG5vLW9wLiBJZiB3ZSBpbnRyb2R1Y2UgYSBtYXRy
aXgtdHJhbnNwb3NlLCBpdCBzaG91bGQgZWl0aGVyIGVycm9yIG9uICZsdDsxZCBpbnB1dHMgd2l0
aCBhIHVzZWZ1bCBtZXNzYWdlLCBvciBpbnNlcnQgdGhlIGV4dHJhIGRpbWVuc2lvbi4gSSdkIGZh
dm9yIHRoZSBmb3JtZXIuPGRpdj48YnI+PC9kaXY+PGRpdj5FcmljPGJyPjxicj48ZGl2IGNsYXNz
PSJnbWFpbF9xdW90ZSI+PGRpdiBkaXI9Imx0ciI+T24gTW9uLCAyOCBNYXkgMjAxOCBhdCAxNjoy
NyBTdGVwaGFuIEhveWVyICZsdDtzaG95ZXJAZ21haWwuY29tJmd0OyB3cm90ZTo8YnI+PC9kaXY+
PGJsb2NrcXVvdGUgY2xhc3M9ImdtYWlsX3F1b3RlIiBzdHlsZT0ibWFyZ2luOjAgMCAwIC44ZXg7
Ym9yZGVyLWxlZnQ6MXB4ICNjY2Mgc29saWQ7cGFkZGluZy1sZWZ0OjFleDsiPjxkaXYgZGlyPSJs
dHIiPjxkaXYgY2xhc3M9ImdtYWlsX3F1b3RlIj48ZGl2IGRpcj0ibHRyIj5PbiBNb24sIE1heSAy
MSwgMjAxOCBhdCA1OjQyIFBNIE1hdHRpIFBpY3VzICZsdDs8YSBocmVmPSJtYWlsdG86bWF0dGku
cGljdXNAZ21haWwuY29tIiB0YXJnZXQ9Il9ibGFuayI+bWF0dGkucGljdXNAZ21haWwuY29tPC9h
PiZndDsgd3JvdGU6PGJyPjwvZGl2PjxibG9ja3F1b3RlIGNsYXNzPSJnbWFpbF9xdW90ZSIgc3R5
bGU9Im1hcmdpbjowIDAgMCAuOGV4O2JvcmRlci1sZWZ0OjFweCAjY2NjIHNvbGlkO3BhZGRpbmct
bGVmdDoxZXgiPi0gY3JlYXRlIGEgd3JhcHBlciB0aGF0IGNhbiBjb252aW5jZSB0aGUgdWZ1bmMg
bWVjaGFuaXNtIHRvIGNhbGwgPGJyPgpfX2FycmF5X3VmdW5jX18gZXZlbiBvbiBmdW5jdGlvbnMg
dGhhdCBhcmUgbm90IHRydWUgdWZ1bmNzPGJyPjwvYmxvY2txdW90ZT48ZGl2Pjxicj48L2Rpdj48
L2Rpdj48L2Rpdj48ZGl2IGRpcj0ibHRyIj48ZGl2IGNsYXNzPSJnbWFpbF9xdW90ZSI+PGRpdj5J
IGFtIHNvbWV3aGF0IG9wcG9zZWQgdG8gdGhpcyBhcHByb2FjaCwgYmVjYXVzZSBfX2FycmF5X3Vm
dW5jX18gaXMgYWJvdXQgb3ZlcmxvYWRpbmcgdWZ1bmNzLCBhbmQgYXMgc29vbiBhcyB3ZSByZWxh
eCB0aGlzIGd1YXJhbnRlZSB0aGUgc2V0IG9mIGludmFyaWFudHMgX19hcnJheV91ZnVuY19fIGlt
cGxlbWVudG9ycyByZWx5IG9uIGJlY29tZXMgbXVjaCBtb3JlIGxpbWl0ZWQuPC9kaXY+PGRpdj48
YnI+PC9kaXY+PGRpdj5XZSByZWFsbHkgc2hvdWxkIGhhdmUgYW5vdGhlciBtZWNoYW5pc20gZm9y
IGFyYml0cmFyeSBmdW5jdGlvbiBvdmVybG9hZGluZyBpbiBOdW1QeSAoTkVQIHRvIGZvbGxvdyBz
aG9ydGx5ISkuPC9kaXY+PC9kaXY+PC9kaXY+PGRpdiBkaXI9Imx0ciI+PGRpdiBjbGFzcz0iZ21h
aWxfcXVvdGUiPjxkaXY+Jm5ic3A7PC9kaXY+PGJsb2NrcXVvdGUgY2xhc3M9ImdtYWlsX3F1b3Rl
IiBzdHlsZT0ibWFyZ2luOjAgMCAwIC44ZXg7Ym9yZGVyLWxlZnQ6MXB4ICNjY2Mgc29saWQ7cGFk
ZGluZy1sZWZ0OjFleCI+Ci0gZXhwYW5kIHRoZSBzZW1hbnRpY3Mgb2YgY29yZSBzaWduYXR1cmVz
IHNvIHRoYXQgYSBzaW5nbGUgbWF0bXVsIHVmdW5jIDxicj4KY2FuIGltcGxlbWVudCBtYXRyaXgt
bWF0cml4LCB2ZWN0b3ItbWF0cml4LCBtYXRyaXgtdmVjdG9yLCBhbmQgPGJyPgp2ZWN0b3ItdmVj
dG9yIG11bHRpcGxpY2F0aW9uLjwvYmxvY2txdW90ZT48ZGl2Pjxicj48L2Rpdj48L2Rpdj48L2Rp
dj48ZGl2IGRpcj0ibHRyIj48ZGl2IGNsYXNzPSJnbWFpbF9xdW90ZSI+PGRpdj5JIHdhcyBpbml0
aWFsbHkgY29uY2VybmVkIHRoYXQgYWRkaW5nIG9wdGlvbmFsIGRpbWVuc2lvbnMgZm9yIGd1ZnVu
Y3Mgd291bGQgaW50cm9kdWNlIGFkZGl0aW9uYWwgY29tcGxleGl0eSBmb3Igb25seSB0aGUgYmVu
ZWZpdCBvZiBhIHNpbmdsZSBmdW5jdGlvbiAobWF0bXVsKSwgYnV0IEknbSBub3cgY29udmluY2Vk
IHRoYXQgaXQgbWFrZXMgc2Vuc2U6PC9kaXY+PGRpdj4xLiBBbGwgb3RoZXIgYXJpdGhtZXRpYyBv
dmVybG9hZHMgdXNlIF9fYXJyYXlfdWZ1bmNfXywgYW5kIGl0IHdvdWxkIGJlIG5pY2UgdG8ga2Vl
cCBAL21hdG11bCBpbiB0aGUgc2FtZSBwbGFjZS48L2Rpdj48ZGl2PjIuIFRoZXJlJ3MgYSBjb21t
b24gZmFtaWx5IG9mIGd1ZnVuY3MgZm9yIHdoaWNoIG9wdGlvbmFsIGRpbWVuc2lvbnMgbGlrZSBu
cC5tYXRtdWwgbWFrZSBzZW5zZTogbWF0cml4IGZ1bmN0aW9ucyB3aGVyZSAxRCBhcnJheXMgc2hv
dWxkIGJlIHRyZWF0ZWQgYXMgMkQgcm93LSBvciBjb2x1bW4tdmVjdG9ycy48L2Rpdj48ZGl2Pjxi
cj48L2Rpdj48ZGl2Pk9uZSBleGFtcGxlIG9mIHRoaXMgY2xhc3Mgb2YgYmVoYXZpb3Igd291bGQg
YmUgbnAubGluYWxnLnNvbHZlLCB3aGljaCBjb3VsZCBzdXBwb3J0IHZlY3RvcnMgbGlrZSBBeD1i
IGFuZCBtYXRyaWNlcyBsaWtlIEF4PUIgd2l0aCB0aGUgc2lnbmF0dXJlIChtLG0pLChtLG4/KS0m
Z3Q7KG0sbj8pLiBXZSBjb3VsZG4ndCBpbW1lZGlhdGVseSBtYWtlIG5wLmxpbmFsZy5zb2x2ZSBh
IGd1ZnVuYyBzaW5jZSBpdCB1c2VzIGEgc3VidGx5IGRpZmZlcmVudCBkaXNwYXRjaGluZyBydWxl
LCBidXQgaXQncyB0aGUgc2FtZSB1c2UtY2FzZS48L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2PkFu
b3RoZXIgZXhhbXBsZSB3b3VsZCBiZSB0aGUgIm1hdHJpeCB0cmFuc3Bvc2UiIGZ1bmN0aW9uIHRo
YXQgaGFzIGJlZW4gb2NjYXNpb25hbGx5IHByb3Bvc2VkLCB0byBzd2FwIHRoZSBsYXN0IHR3byBk
aW1lbnNpb25zIG9mIGFuIGFycmF5LiBJdCBjb3VsZCBoYXZlIHRoZSBzaWduYXR1cmUgKG0/LG4p
LSZndDsobixtPyksIHdoaWNoIGVuc3VyZSB0aGF0IGl0IGlzIHN0aWxsIHdlbGwgZGVmaW5lZCAo
YXMgdGhlIGlkZW50aXR5KSBvbiAxZCBhcnJheXMuPC9kaXY+PC9kaXY+PC9kaXY+Cl9fX19fX19f
X19fX19fX19fX19fX19fX19fX19fXzx3YnI+X19fX19fX19fX19fX19fX188YnI+Ck51bVB5LURp
c2N1c3Npb24gbWFpbGluZyBsaXN0PGJyPgo8YSBocmVmPSJtYWlsdG86TnVtUHktRGlzY3Vzc2lv
bkBweXRob24ub3JnIiB0YXJnZXQ9Il9ibGFuayI+TnVtUHktRGlzY3Vzc2lvbkBweXRob24ub3Jn
PC9hPjxicj4KPGEgaHJlZj0iaHR0cHM6Ly9tYWlsLnB5dGhvbi5vcmcvbWFpbG1hbi9saXN0aW5m
by9udW1weS1kaXNjdXNzaW9uIiByZWw9Im5vcmVmZXJyZXIiIHRhcmdldD0iX2JsYW5rIiBkYXRh
LXNhZmVyZWRpcmVjdHVybD0iaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS91cmw/cT1odHRwczovL21h
aWwucHl0aG9uLm9yZy9tYWlsbWFuL2xpc3RpbmZvL251bXB5LWRpc2N1c3Npb24mYW1wO3NvdXJj
ZT1nbWFpbCZhbXA7dXN0PTE1Mjc2NDcyMTQ0NTQwMDAmYW1wO3VzZz1BRlFqQ05INkJJSFRIMmNf
TXpncU5JZHJmV2R6NTBtSC1RIj5odHRwczovL21haWwucHl0aG9uLm9yZy9tYWlsbWE8d2JyPm4v
bGlzdGluZm8vbnVtcHktZGlzY3Vzc2lvbjwvYT48YnI+CjwvYmxvY2txdW90ZT48L2Rpdj48L2Rp
dj4=" style="height:0;width:0;max-height:0;max-width:0;overflow:hidden;font-size:0em;padding:0;margin:0">​</div></div></div>