【问题标题】:How to search a 1 x 9 x N dimension np.array for a 1 x 9 dimension np.array?如何在 1 x 9 x N 维度 np.array 中搜索 1 x 9 维度 np.array?
【发布时间】:2020-06-27 05:53:58
【问题描述】:

我正在解决 8 谜题。在创建可能的移动状态并选择最佳状态后,我将当前最佳移动的数组附加到一个名为 used set 的数组中。

bestMove = 
[0,1,2,3,4,5,6,7,8]

usedSet =
[0,1,2,3,4,5,6,7,8]
[1,0,2,3,4,5,6,7,8]
[0,1,2,3,4,5,6,7,8]
[1,0,2,3,4,5,6,7,8]
[0,1,2,3,4,5,6,7,8]
[1,0,2,3,4,5,6,7,8]
[0,1,2,3,4,5,6,7,8]
[1,0,2,3,4,5,6,7,8]

在不知道它之前的动作是什么的情况下,程序会左右移动。我希望该程序看到它之前已经采取了这一举措,而不是将其视为最佳举措。

我不确定如何将我当前的最佳移动与已使用集合中的数组进行比较。我以为我可以使用 any 或 all 命令,但使用该方法会遇到死胡同。

【问题讨论】:

    标签: python arrays python-3.x numpy sorting


    【解决方案1】:

    除非您有令人信服的理由使用 numpy 数组,否则这似乎更适合 Python 内置类型:

    您可以将您的移动编码为tuples 并将它们存储在set 中:

    >>> usedset = set()
    >>> bestmove = (0, 1, 2, 3, 4, 5, 6, 7, 8)
    >>> usedset.add(bestmove)
    >>> bestmove in usedset
    
    True
    

    请注意,您需要使用元组而不是 numpy 数组(或列表),因为元组是可散列的,这是将它们存储在 set 中的要求。成员资格检查是 O(1) 的集合,所以这实际上非常快。

    为了在您的代码中实现这一点,您将使用带有 if 的 in 语句,如下所示:

    bestmove = get_best_move()
    if bestmove not in usedset:
        usedset.add(bestmove)
        evaluate_move(bestmove)
    

    如果你绝对必须使用 numpy 数组,你可以将它们转换进去:

    usedset.add(tuple(bestmove))
    

    如果 bestmove 是一个 numpy 数组,则可以使用。

    【讨论】:

    • 我试图用我的代码来实现这个集合。我得到了 numpy 数组来转换和重塑为 1 x 9 格式。它将添加到集合中。但是,如果元组已经在集合中,我该如何停止 if 语句? code if tuple(map(tuple, np.reshape(a, (1, 9)))) in usedSetcode
    • 我用一个检查移动是否在 usedset 中的例子扩展了答案。基本上你使用in 操作符。
    • 非常感谢!我让程序运行并能够解决一个需要 60 多个步骤的谜题!现在是时候让输出更漂亮了,而不是我制作的第一个真正程序的调试嵌套。
    猜你喜欢
    • 1970-01-01
    • 2022-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-26
    • 1970-01-01
    • 2020-07-07
    相关资源
    最近更新 更多