没有NumPy对象的操作会引发NumPy ValueError(数组的真值..)



我发现一个错误,必须由NP:引发

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

它出现在这行代码中:

adjacent_food_sources = [field for field in self.map.food if (field['pos'] in adjacent_positions)]

涉及的两个变量是(来自印刷品):

# adjacent_positions - normal 2d list
[[240, 392], [239, 393], [238, 392], [239, 391], [240, 393], [240, 391], [238, 393], [238, 391]]
# self.map.food - normal list containing normal dicts
[{'food': 50, 'pos': (420, 267)}, {'food': 50, 'pos': (324, 69)}, {'food': 50, 'pos': (480, 368)}, {'food': 50, 'pos': (248, 443)}, {'food': 50, 'pos': (354, 32)}]

如果我试图在shell中复制它,adjacent_food_sources就会变成一个空列表,因为没有一个位置匹配。

为什么NP在这里提出错误?我确实在代码的其他部分使用了它,但这里我显然有一个纯粹的"香草"python。

Python版本:3.2.5
NumPy版本:1.8.2

基于您的观察,即当"pos"成员变成数组时会出现问题:

有了你的职位嵌套列表,我可以做:

In [308]: positions
Out[308]: 
[[240, 392],
 [239, 393],
 [238, 392],
 [239, 391],
 [240, 393],
 [240, 391],
 [238, 393],
 [238, 391]]
In [309]: (239,393) in positions # a tuple can't match a list
Out[309]: False
In [310]: [239,393] in positions   # normal list match
Out[310]: True
In [311]: np.array([239,393]) in positions
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-311-10ddf5047e75> in <module>()
----> 1 np.array([239,393]) in positions
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
In [312]: np.array([239,393]) == positions[0]
Out[312]: array([False, False], dtype=bool)

in转换为contrains方法,该方法又必须对positions中的每个元素执行某种相等。但是数组逐个元素应用测试,返回布尔数组。正是该布尔数组与contains的标量真/假期望之间的不兼容导致了错误。

pos值封装在list()中就可以了。它甚至允许元组的正确匹配:

In [315]: list(np.array([239,393])) in positions
Out[315]: True
In [316]: list((239,393)) in positions
Out[316]: True

如果你想确保(2d或更高)数组的所有元素都转换成列表,array.tolist()list(array)更好,但在这里我认为list()可以。

我能够解决问题:

我发布的代码行在一个循环中。在执行行的第一次迭代中,一切都很好。然而,在每次迭代接近尾声时,self.map.food中每个dict的pos成员变成NP数组。

我想当用in测试时,NP想告诉我,我必须检查pos的任何或所有元素是否在adjacent_positions中。NP显然不允许我检查pos本身是否在adjacent_positions中。

最新更新