Numpy : The Truth Value Of An Array With More Than One Element Is Ambiguous
Solution 1:
Numpy arrays define a custom equality operator, i.e. they are objects that implement the __eq__
magic function. Accordingly, the ==
operator and all other functions/operators that rely on such an equality call this custom equality function.
Numpy's equality is based on element-wise comparison of arrays. Thus, in return you get another numpy array with boolean values. For instance:
x = np.array([1,2,3])
y = np.array([1,4,5])
x == y
returns
array([ True, False, False], dtype=bool)
However, the in
operator in combination with lists requires equality comparisons that only return a single boolean value. This is the reason why the error asks for all
or any
. For instance:
any(x==y)
returns True
because at least one value of the resulting array is True
.
In contrast
all(x==y)
returns False
because not all values of the resulting array are True
.
So in your case, a way around the problem would be the following:
other_pairs = [p for p in points if all(any(p!=q) for q in max_pair)]
and print other_pairs
prints the expected result
[array([1, 6]), array([3, 7])]
Why so? Well, we look for an item p from points where any of its entries are unequal to the entries of all items q from max_pair.
Solution 2:
Reason behind is that they're two different objects completely. np.array
has it's own operators that work on it.
They are named the same as the global operators any
and all
but don't work exactly the same, and that distinction is reflected in the fact they are methods of np.array
.
>>> x = np.array([0,9])
>>> x.any(axis=0)
True
>>> y = np.array([10, 10])
>>> y.all()
True
>>> y.all(axis=0)
True
meanwhile:
>>> bool([])
False
>>> bool([[]])
True
>>> bool([[]][0])
False
Notice how first result is false (in python2) an empty list is deemed False
. However a list with another list in it, even if that one is empty, is not False
but True
. Evaluating the inside list returns False
again because it's empty. Since any
and all
are defined over the conversion to bool
the results you see are different.
>>> help(all)
all(...)
all(iterable) -> bool
Return True if bool(x) is True for all values x in the iterable.
>>> help(any)
any(...)
any(iterable) -> bool
Return True if bool(x) is True for any x in the iterable.
See a better explanations for logical numpy operators here
Post a Comment for "Numpy : The Truth Value Of An Array With More Than One Element Is Ambiguous"