Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
554 views
in Technique[技术] by (71.8m points)

python - Numpy : The truth value of an array with more than one element is ambiguous

I am really confused on why this error is showing up. Here is my code:

import numpy as np

x = np.array([0, 0])
y = np.array([10, 10])
a = np.array([1, 6])
b = np.array([3, 7])
points = [x, y, a, b]
max_pair = [x, y]
other_pairs = [p for p in points if p not in max_pair]
>>>ValueError: The truth value of an array with more than one element is ambiguous. 
Use a.any() or a.all()
(a not in max_paix)
>>>ValueError: The truth ...

What confuses me is that the following works fine:

points = [[1, 2], [3, 4], [5, 7]]
max_pair = [[1, 2], [5, 6]]
other_pairs = [p for p in points if p not in max_pair]
>>>[[3, 4], [5, 7]]
([5, 6] not in max_pair)
>>>False

Why is this happening when using numpy arrays? Is not in/in ambiguous for existance?
What is the correct syntax using any()all()?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

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.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...