[Numpy-discussion] Why is the shape of a singleton array the empty tuple?

David Goldsmith d.l.goldsmith at gmail.com
Sun Mar 7 02:04:19 EST 2010


On Sat, Mar 6, 2010 at 10:26 PM, Ian Mallett <geometrian at gmail.com> wrote:

> On Sat, Mar 6, 2010 at 9:46 PM, David Goldsmith <d.l.goldsmith at gmail.com>wrote:
>
>> 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 "why (is it so)," not "how (to make it
>> different)").
>>
> Well, I can't help you with that.  I would also ask why this design even
> exists?   Equating an array with a single number doesn't make sense to me.
> Ian
>

Here's an (unintended) use case:

I wanted to convert anything in an array that'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.

Here's my (working) code (I'm sure that once Robert sees it, he'll be able
to replace it w/ a one-liner):

def convert_close(arg):
    arg = N.array(arg)
    if not arg.shape:
        arg = N.array((arg,))
    if arg.size:
        t = N.array([0 if N.allclose(temp, 0) else temp for temp in arg])
        if len(t.shape) - 1:
            return N.squeeze(t)
        else:
            return t
    else:
        return N.array()

At first I wasn't "casting" 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's what I wanted to return as well, it seemed most appropriate to
"cast" 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
"right" thing as well), but the list comprehension still wouldn'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'd still like to know _why_ N.array(scalar).shape == () but
N.array((scalar,)).shape == (1,).  No biggy, just curious.

DG
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/numpy-discussion/attachments/20100306/dfaf86bb/attachment.html>


More information about the NumPy-Discussion mailing list