我发现一个错误,必须由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
中。