Python NumPy数组数据比较

Python NumPy数组数据比较,python,python-3.x,numpy,Python,Python 3.x,Numpy,我有两个3D Numpy阵列 win_combination = np.array([ [[0, 0], [0, 1], [0, 2]], [[1, 0], [1, 1], [1, 2]], [[2, 0], [2, 1], [2, 2]], [[0, 0], [1, 0], [2, 0]], [[0, 1], [1, 1], [2, 1]], [[0, 2], [1, 2], [2, 2]], [[0, 0], [1, 1], [2, 2]], [[0, 2], [1, 1], [2, 0]]

我有两个3D Numpy阵列

win_combination = np.array([
[[0, 0], [0, 1], [0, 2]],
[[1, 0], [1, 1], [1, 2]],
[[2, 0], [2, 1], [2, 2]],
[[0, 0], [1, 0], [2, 0]],
[[0, 1], [1, 1], [2, 1]],
[[0, 2], [1, 2], [2, 2]],
[[0, 0], [1, 1], [2, 2]],
[[0, 2], [1, 1], [2, 0]]
])
以及

我想比较游戏日志数据是否匹配win_组合中的任何数组,如果匹配,则可能会打印True,否则打印False

基本上,我希望如果game_log=[[0,0],[0,1],[0,2]]它可以打印为True,如果不是,那么我的代码应该比较另一个数组game_log==[[1,0],[1,1],[1,2]]如果不是,那么另一个数组等等,直到最后,如果没有匹配game_log的数组,那么它应该打印为false,在这种情况下,它应该打印为false

我试过了

for comb in win_combination:
    if game_log == comb:
        print(True)
    else:
        print(False)
IIUC:

尝试以下方法:

   def in_array(game_log, array):
        for comb in array:
            for arr in comb:
                if game_log.all() == arr.all():
                    return True
        return False
游戏日志传递给第一个参数,将3D传递给下一个参数,根据我的理解,如果组合在数组中,则应打印,否则打印


请记住,包含多个元素的数组的真值是不明确的。因此,如果两个数组完全匹配,则最好使用all();如果一个数组中的任何元素存在于另一个数组中,则最好使用any()

如果
np.all(x==y)
(或者
(x==y.all())则两个数组相等。您有一个三维形状数组
(N,a,B)
和一个二维形状数组
(a,B)
。在这种情况下,
N=8
A=3
B=2
。这些形状将广播到3D阵列的形状。如果应用到最后两个维度,则可以获得每个组合的
N
True
False
值。然后将告诉您其中是否有
正确的

all
有一个
关键字。从numpy 1.7.0开始,
axis
可以同时指定多个轴,因此您可以执行以下操作:

matches = np.all(win_combination == game_log, axis=(-1, -2))
对于旧版本的numpy,您必须重新整形以获得一个轴,或者应用
all
两次:

matches = np.all((win_combination == game_log).reshape(win_comination.shape[0], -1), axis=-1)

最终结果是
匹配.any()
np.any(匹配)
。您可以将其写为一行:

np.all(win_combination == game_log, axis=(-1, -2)).any()

你试的时候发生了什么?你真正的问题是什么?你没有两个3D阵列。您有一个2D和一个3D按钮插入
else
。如果第一个元素不匹配,您不一定要返回
False
。您应该真正返回值,而不是打印它们。您始终可以打印返回值,但如果不返回,则无法恢复打印的内容。感谢您的修复您不需要复制
game\u log
:由于维度排列在右侧,广播可以为您完成此操作。你也不需要尺寸。您的整个解决方案只是第三行,但是使用了
game\u log
而不是
games
。您可能会发现一个有趣的链接:。这就是为什么numpy中有如此多的魔力成为可能。感谢您的反馈!我对广播不太在行,也许这个链接对我有帮助。这里有另一个链接帮助我更好地将其形象化:。这不是一个简单的话题,但过一段时间你就会习惯了。基本的想法是把右边的形状排成一行。
matches = np.all((win_combination == game_log).reshape(win_comination.shape[0], -1), axis=-1)
matches = np.all(np.all(win_combination == game_log, axis=-1), axis=-1)
np.all(win_combination == game_log, axis=(-1, -2)).any()