<div dir="ltr"><blockquote 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" class="gmail_quote">On Wed, Apr 8, 2015 at 7:34 PM, Neil Girdhar <<a href="http://mail.scipy.org/mailman/listinfo/numpy-discussion">mistersheik@gmail.com</a>> wrote:<br>><i> Numpy's outer product works fine with vectors.  However, I seem to always<br>
</i>><i> want len(outer(a, b).shape) to be equal to len(a.shape) + len(b.shape).<br>
</i>><i> Wolfram-alpha seems to agree<br>
</i>><i> <a href="https://reference.wolfram.com/language/ref/Outer.html">https://reference.wolfram.com/language/ref/Outer.html</a> with respect to matrix<br>
</i>><i> outer products.<br>
</i>
You're probably right that this is the correct definition of the outer<br>product in an n-dimensional world. But this seems to go beyond being<br>just a bug in handling 0-d arrays (which is the kind of corner case<br>we've fixed in the past); np.outer is documented to always ravel its<br>inputs to 1d.<br>
In fact the implementation is literally just:<br>
    a = asarray(a)<br>    b = asarray(b)<br>    return multiply(a.ravel()[:, newaxis], b.ravel()[newaxis,:], out)<br>
Sebastian's np.multiply.outer is much more generic and effective.<br>
Maybe we should just deprecate np.outer? I don't see what use it<br>serves. (When and whether it actually got removed after being<br>deprecated would depend on how much use it actually gets in real code,<br>which I certainly don't know while typing a quick email. But we could<br>start telling people not to use it any time.)<br></blockquote><div><br></div><div>+1 with everything you said.</div><div><br></div><div>(And thanks Sebastian for the pointer to np.multiply.outer!)</div><div> </div><blockquote 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" class="gmail_quote">
-n</blockquote></div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Apr 8, 2015 at 7:34 PM, Neil Girdhar <span dir="ltr"><<a href="mailto:mistersheik@gmail.com" target="_blank">mistersheik@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Numpy's outer product works fine with vectors.  However, I seem to always want len(outer(a, b).shape) to be equal to len(a.shape) + len(b.shape).  Wolfram-alpha seems to agree <a href="https://reference.wolfram.com/language/ref/Outer.html" target="_blank">https://reference.wolfram.com/language/ref/Outer.html</a> with respect to matrix outer products.  My suggestion is to define outer as defined below.  I've contrasted it with numpy's current outer product.<div><div><br></div><div><div>In [36]: def a(n): return np.ones(n)</div><div><br></div><div>In [37]: b = a(())</div><div><br></div><div>In [38]: c = a(4)</div><div><br></div><div>In [39]: d = a(5)</div><div><br></div><div>In [40]: np.outer(b, d).shape</div><div>Out[40]: (1, 5)</div><div><br></div><div>In [41]: np.outer(c, d).shape</div><div>Out[41]: (4, 5)</div><div><br></div><div>In [42]: np.outer(c, b).shape</div><div>Out[42]: (4, 1)</div><div><br></div><div>In [43]: def outer(a, b):</div><div>    return a[(...,) + len(b.shape) * (np.newaxis,)] * b</div><div>   ....:</div><div><br></div><div>In [44]: outer(b, d).shape</div><div>Out[44]: (5,)</div><div><br></div><div>In [45]: outer(c, d).shape</div><div>Out[45]: (4, 5)</div><div><br></div><div>In [46]: outer(c, b).shape</div><div>Out[46]: (4,)</div></div></div><div><br></div><div>Best,</div><div><br></div><div>Neil</div></div>
</blockquote></div><br></div>