Python 移除numpy中的特定子阵列

Python 移除numpy中的特定子阵列,python,numpy,Python,Numpy,我正在使用一个存储游戏特定状态的numpy数组,通过“扩展”当前状态并创建一个新数组来搜索该状态空间,该数组存储可以从当前状态到达的可能状态。为了避免搜索循环,我需要删除由无效移动导致的任何数组(如果进行了无效移动,则结果状态等于当前状态) 为了实现这一点,我尝试使用: 但是,如果当前状态没有可能的无效移动,并且不应从后续状态中删除任何可能的状态,则始终删除第一个状态。谁能帮我解释一下为什么会这样,或者我哪里出错了?这个问题可以用一个虚拟的例子来说明。这是您的继任者,我们使用state>100作

我正在使用一个存储游戏特定状态的numpy数组,通过“扩展”当前状态并创建一个新数组来搜索该状态空间,该数组存储可以从当前状态到达的可能状态。为了避免搜索循环,我需要删除由无效移动导致的任何数组(如果进行了无效移动,则结果状态等于当前状态)

为了实现这一点,我尝试使用:


但是,如果当前状态没有可能的无效移动,并且不应从后续状态中删除任何可能的状态,则始终删除第一个状态。谁能帮我解释一下为什么会这样,或者我哪里出错了?

这个问题可以用一个虚拟的例子来说明。这是您的继任者,我们使用state>100作为当前状态

a = numpy.arange(10)
successors = [a.copy(), a.copy(), a.copy()]

numpy.where(numpy.array_equal(state, state>100) for state in successors)
>>> (array([0], dtype=int64),)
元素为0的数组负责下一步的删除

假设继任者是一个列表,我们得到:

[numpy.array_equal(i, i>100) for i in successor]
>>> [False, False False]
其中numpy.where只返回第一个元素

为避免此问题,请检查是否有任何状态匹配,如果没有匹配,则不执行删除

a = [np.array_equal(state, current_state) for state in successors]
if any(a):
    invalid_moves = np.where(a)
    successors = np.delete(successors, invalid_moves, axis=0) 

非常感谢。这正是我看到的行为,但是你知道如何避免吗?谢谢你的帮助。我一直在尝试类似的方法,而您的解决方案正是我想要的。继承者的形状(和数据类型)是什么。您是否查看过各种情况下的
无效\u移动
?它是数组的元组,可能长度为0。在不深入讨论细节的情况下,我认为将
where
元组直接传递到
delete
是没有意义的。后继者是一个(s,n,n)数组,其中s是给定当前状态可能出现的状态数,每个状态是(n,n)。
a = [np.array_equal(state, current_state) for state in successors]
if any(a):
    invalid_moves = np.where(a)
    successors = np.delete(successors, invalid_moves, axis=0)