On Sat, Mar 6, 2010 at 10:26 PM, Ian Mallett <span dir="ltr">&lt;<a href="mailto:geometrian@gmail.com">geometrian@gmail.com</a>&gt;</span> wrote:<br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
<div class="im">On Sat, Mar 6, 2010 at 9:46 PM, David Goldsmith <span dir="ltr">&lt;<a href="mailto:d.l.goldsmith@gmail.com" target="_blank">d.l.goldsmith@gmail.com</a>&gt;</span> wrote:<br></div><div class="gmail_quote">
<div class="im"><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
<div class="gmail_quote"><div>Thanks, Ian.  I already figured out how to make it not so, but I still want to 
understand the design reasoning behind it being so in the first place (thus the use of the question &quot;why (is it so),&quot; not &quot;how (to make it different)&quot;).<br></div></div></blockquote></div><div>Well, I can&#39;t help you with that.  I would also ask why this design even exists?   Equating an array with a single number doesn&#39;t make sense to me.  <br>

</div><div>Ian <br></div></div></blockquote><div><br>Here&#39;s an (unintended) use case:<br><br>I wanted to convert anything in an array that&#39;s close to zero to be zero (and leave the rest as is), but I want it to be robust so that if it receives a scalar, it can work w/ that, too.<br>
<br>Here&#39;s my (working) code (I&#39;m sure that once Robert sees it, he&#39;ll be able to replace it w/ a one-liner): <br></div><br></div>def convert_close(arg):<br>    arg = N.array(arg)<br>    if not arg.shape:<br>        arg = N.array((arg,))<br>
    if arg.size:<br>        t = N.array([0 if N.allclose(temp, 0) else temp for temp in arg])<br>        if len(t.shape) - 1:<br>            return N.squeeze(t)<br>        else:<br>            return t<br>    else:<br>        return N.array()<br>
<br>At first I wasn&#39;t &quot;casting&quot; arg to be an array upon entry, but I found that if arg is a scalar, my list comprehension failed, so I had choose _some_ sort of sequence to cast scalars to; since arg will typically be an array and that&#39;s what I wanted to return as well, it seemed most appropriate to &quot;cast&quot; incoming scalars to arrays.  So I added the arg = N.array(arg) at the beginning (N.array(array) = array, and N.array(non-array seq) does the &quot;right&quot; thing as well), but the list comprehension still wouldn&#39;t work if arg was a scalar upon entry; after many print statements and much interactive experimenting, I finally figured out that this is because the shape of N.array(scalar) is () (and I thence immediately guessed, correctly of course, that N.array((scalar,)) has shape (1,)).  So I added the if not arg.shape: to detect and correct for those zero size arrays, and now it works fine, but I&#39;d still like to know _why_ N.array(scalar).shape == () but N.array((scalar,)).shape == (1,).  No biggy, just curious.<br>
<br>DG<br>