<div dir="ltr"><div style="font-size:12.8px">> But I would have expected these to raise ValueErrors recommending any() and all():</div><span class="gmail-im" style="font-size:12.8px"><div style="font-size:12.8px"><div style="font-size:12.8px"><div>> >>> bool(np.array([1]))<br></div><div>> True</div></div><div style="font-size:12.8px"><div>> >>> bool(np.array([0]))<br></div><div>> False</div><div><br></div><div><span style="font-size:12.8px">While I can't confess to know the *actual* reason why single-element arrays evaluate the way they do, this is how I understand it:</span><br></div><div><span style="font-size:12.8px"><br></span></div><div><span style="font-size:12.8px">One thing that single-element arrays have going for them is that, for arrays like this, `x.any() == x.all()`.  Hence, in these cases, there is no ambiguity.</span></div><div><br></div><div>In this same light, we can see yet another argument against bool(np.array([])), because guess what:  This one IS ambiguous!</div><div><br></div><div>>>> np.array([]).any()</div><div>False</div><div>>>> np.array([]).all()</div><div>True</div></div></div></span></div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Aug 18, 2017 at 6:37 PM, Paul Hobson <span dir="ltr"><<a href="mailto:pmhobson@gmail.com" target="_blank">pmhobson@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">Maybe I'm missing something. <div><br></div><div>This seems fine to me:</div><div><div style="font-size:12.8px">>>> bool(np.array([]))<br></div><div style="font-size:12.8px">False</div></div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px">But I would have expected these to raise ValueErrors recommending any() and all():</div><span class=""><div style="font-size:12.8px"><div style="font-size:12.8px"><div>>>> bool(np.array([1]))<br></div><div>True</div></div><div style="font-size:12.8px"><div>>>> bool(np.array([0]))<br></div><div>False</div></div></div></span></div><div class="HOEnZb"><div class="h5"><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Aug 18, 2017 at 3:00 PM, Stephan Hoyer <span dir="ltr"><<a href="mailto:shoyer@gmail.com" target="_blank">shoyer@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">I agree, this behavior seems actively harmful. Let's fix it. </div><div class="gmail_extra"><br><div class="gmail_quote"><div><div class="m_-6702365798392115093h5">On Fri, Aug 18, 2017 at 2:45 PM, Michael Lamparski <span dir="ltr"><<a href="mailto:diagonaldevice@gmail.com" target="_blank">diagonaldevice@gmail.com</a>></span> wrote:<br></div></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div class="m_-6702365798392115093h5"><div dir="ltr"><div>Greetings, all.  I am troubled.</div><div><br></div><div>The TL;DR is that `bool(array([])) is False` is misleading, dangerous, and unnecessary. Let's begin with some examples:</div><div><br></div><div>>>> bool(np.array(1))<br></div><div>True</div><div>>>> bool(np.array(0))</div><div>False</div><div>>>> bool(np.array([0, 1]))<br></div><div>ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()</div><div><div>>>> bool(np.array([1]))<br></div><div>True</div></div><div><div>>>> bool(np.array([0]))<br></div><div>False</div></div><div>>>> bool(np.array([]))<br></div><div>False</div><div><br>One of these things is not like the other.</div><div><br></div><div>The first three results embody a design that is consistent with some of the most fundamental design choices in numpy, such as the choice to have comparison operators like `==` work elementwise.  And it is the only such design I can think of that is consistent in all edge cases. (see footnote 1)</div><div><br></div><div>The next two examples (involving arrays of shape (1,)) are a straightforward extension of the design to arrays that are isomorphic to scalars.  I can't say I recall ever finding a use for this feature... but it seems fairly harmless.</div><div><br></div><div>So how about that last example, with array([])?  Well... it's /kind of/ like how other python containers work, right? Falseness is emptiness (see footnote 2)...  Except that this is actually *a complete lie*, due to /all of the other examples above/!</div><div><br></div><div>Here's what I would like to see:</div><div><br></div><div>>>> bool(np.array([]))<br></div><div><div>ValueError: The truth value of a non-scalar array is ambiguous. Use a.any() or a.all()</div></div><div><br></div><div>Why do I care?  Well, I myself wasted an hour barking up the wrong tree while debugging some code when it turned out that I was mistakenly using truthiness to identify empty arrays. It just so happened that the arrays always contained 1 or 0 elements, so it /appeared/ to work except in the rare case of array([0]) where things suddenly exploded.</div><div><br></div><div>I posit that there is no usage of the fact that `bool(array([])) is False` in any real-world code which is not accompanied by a horrible bug writhing in hiding just beneath the surface. For this reason, I wish to see this behavior *abolished*.</div><div><br></div><div>Thank you.</div><div>-Michael<br></div><div><br></div><div><div>Footnotes:<br></div></div><div><div>1: Every now and then, I wish that `ndarray.__{bool,nonzero}__` would just implicitly do `all()`, which would make `if a == b:` work like it does for virtually every other reasonably-designed type in existence.  But then I recall that, if this were done, then the behavior of `if a != b:` would stand out like a sore thumb instead.  Truly, punting on 'any/all' was the right choice.</div><div><br></div><div>2: np.array([[[[]]]]) is also False, which makes this an interesting sort of n-dimensional emptiness test; but if that's really what you're looking for, you can achieve this much more safely with `np.all(x.shape)` or `bool(x.flat)`</div></div></div>
<br></div></div>______________________________<wbr>_________________<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/mailma<wbr>n/listinfo/numpy-discussion</a><br>
<br></blockquote></div><br></div>
<br>______________________________<wbr>_________________<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/mailma<wbr>n/listinfo/numpy-discussion</a><br>
<br></blockquote></div><br></div>
</div></div><br>______________________________<wbr>_________________<br>
NumPy-Discussion mailing list<br>
<a href="mailto:NumPy-Discussion@python.org">NumPy-Discussion@python.org</a><br>
<a href="https://mail.python.org/mailman/listinfo/numpy-discussion" rel="noreferrer" target="_blank">https://mail.python.org/<wbr>mailman/listinfo/numpy-<wbr>discussion</a><br>
<br></blockquote></div><br></div>