检查numpy数组中的任何元素是否不在列表中?

时间:2018-11-26 15:09:32

标签: python python-3.x numpy

我有一个小清单:

moveless = [0,11,30,31,20,21,22,23,24,25,26,27,28,29]

例如,像这样的数组(它总是嵌套在这样的列表中,但是通常会有成千上万的数组,并且-1到31之间的任何数字都可以位于任何位置):

starting_board = [([[ 6, -1, -1,  11, 0,  11, -1,  -1,  -1, -1],
       [-1, -1, -1, -1, -1, -1, -1,  11, -1, -1],
       [-1, -1, -1, -1, -1, -1, -1, 1, -1, -1],
       [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1],
       [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1],
       [-1, -1, -1, -1, -1, -1, -1, -1, -1, 2],
       [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1],
       [-1, -1, -1, 20, 31, -1, 25, -1, -1, -1]])]

并且我需要确定此数组的任何元素是否都不是不可移动的。因此,如果它解析并达到6,它可能会停止。

我觉得必须有一种更快,更优雅/ pythonic的方法来完成此任务,而不仅仅是几个循环,但是我在该站点上的numpy docs / elsewhere中进行的检查并没有发现任何非常有用的东西。

2 个答案:

答案 0 :(得分:2)

使用isin()

/data/data/com.yourpackagename/databases/

输出:

starting_board = [([[ 6, -1, -1,  11, 0,  11, -1,  -1,  -1, -1],
       [-1, -1, -1, -1, -1, -1, -1,  11, -1, -1],
       [-1, -1, -1, -1, -1, -1, -1, 1, -1, -1],
       [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1],
       [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1],
       [-1, -1, -1, -1, -1, -1, -1, -1, -1, 2],
       [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1],
       [-1, -1, -1, 20, 31, -1, 25, -1, -1, -1]])]
moveless = [0,11,30,31,20,21,22,23,24,25,26,27,28,29]
print(np.isin(starting_board, moveless))

答案 1 :(得分:1)

如果您只需要知道列表中是否没有任何个元素,只需进行一组比较即可:

any_items_not_in_moveless = {element for row in starting_board[0] for element in row} - set(moveless)
# OR
any_items_not_in_moveless = set(np.asarray(starting_board[0]).ravel()) - set(moveless)

正如@Chirag指出的那样,您还可以利用Numpy的isin函数。对于您自己的情况,您需要找出哪种解决方案对您来说更快/更好:

any_items_not_in_moveless = (~np.asarray(starting_board[0]).isin(moveless)).any()