[Numpy-discussion] truthiness of object arrays
Sebastian Berg
sebastian at sipsolutions.net
Thu Nov 13 03:42:45 EST 2014
On Mi, 2014-11-12 at 22:19 -0800, Antony Lee wrote:
> I know you can't in general, but this was in a context where I knew
> the array contained a single element, which "works" (it checks the
> truthiness of the contained element). Of course I didn't consider the
> case where the element contained was itself a (non-trivial) array,
> thus the finding.
> The link you posted doesn't seem to address what magic numpy can do to
> make "bool(x)" and "if x:" have different behaviors (FWIW,
> "t.__bool__()" also returns True).
> Antony
>
First sight, sounds like a bug. It should be passing out the error
raised by the array inside. Can you open an issue?
- Sebastian
> 2014-11-12 20:15 GMT-08:00 Michael Sarahan <msarahan at gmail.com>:
> Hi Antony,
>
> In general, you can't use numpy arrays in if statements
> without using any() or all() or some other means of obtaining
> a single boolean value from the whole array.
>
> I think your confusion is that bool() uses truth testing rules
> outlined here:
> https://docs.python.org/release/2.5.2/lib/truth.html
>
> If statements in theory have equivalent behavior, but take
> slightly different paths (they don't call bool() directly).
> This SO post was enlightening to me:
> http://stackoverflow.com/questions/11885382/is-there-any-difference-between-if-boolx-and-if-x-in-python
>
> Without looking at Numpy's code, I'd bet Numpy arrays probably
> define __bool__ or __nonzero__ in such a way that the
> ValueError is raised when it makes sense to do so.
>
> HTH,
> Mike
>
>
> On Tue, Nov 11, 2014 at 12:46 PM, Antony Lee
> <antony.lee at berkeley.edu> wrote:
>
> I am puzzled by the following (numpy 1.9.0, python
> 3.4.2):
>
>
> In [1]: t = array(None); t[()] = array([None, None])
> # Construct a 0d array of dtype object, containing a
> single numpy array with 2 elements
>
>
> In [2]: bool(t)
> Out[2]: True
>
>
> In [3]: if t: pass
> ---------------------------------------------------------------------------
> ValueError Traceback
> (most recent call last)
> ValueError: The truth value of an array with more than
> one element is ambiguous. Use a.any() or a.all()
>
>
> I thought that "if x" simply calls "bool", but
> apparently this is not even the case...
>
>
> Antony
>
>
> _______________________________________________
> NumPy-Discussion mailing list
> NumPy-Discussion at scipy.org
> http://mail.scipy.org/mailman/listinfo/numpy-discussion
>
>
>
>
> _______________________________________________
> NumPy-Discussion mailing list
> NumPy-Discussion at scipy.org
> http://mail.scipy.org/mailman/listinfo/numpy-discussion
>
>
>
> _______________________________________________
> NumPy-Discussion mailing list
> NumPy-Discussion at scipy.org
> http://mail.scipy.org/mailman/listinfo/numpy-discussion
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: This is a digitally signed message part
URL: <http://mail.python.org/pipermail/numpy-discussion/attachments/20141113/365e28de/attachment.sig>
More information about the NumPy-Discussion
mailing list