【问题标题】:NumPy array data ComparisonNumPy 数组数据比较
【发布时间】:2020-04-07 18:04:43
【问题描述】:

我有两个 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]]
])

和,

game_log = np.array([[1 1],[0 2],[1 0]])

我想比较一下 game_log 数据是否匹配 win_combination 中的任何数组,如果匹配,则可能打印 True,否则打印 False。

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

我试过了,

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

【问题讨论】:

  • 你尝试的时候发生了什么?您的实际问题是什么?
  • 您没有两个 3D 数组。你有一个 2D 和一个 3D
  • 取消缩进else。如果第一个元素不匹配,您不一定要返回 False。

标签: python python-3.x numpy


【解决方案1】:

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

all 有一个 axis 关键字。从 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)

或

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

最终结果为matches.any() 或np.any(matches)。你可以把它写成单行:

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

【讨论】:

    【解决方案2】:

    IIUC:

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

    【讨论】:

    • 您不需要复制game_log:广播会为您完成,因为尺寸在右侧排列。你也不需要大小。您的整个解决方案只是第三行,但使用game_log 而不是games。
    • 这里有一个您可能会感兴趣的链接:docs.scipy.org/doc/numpy/user/basics.broadcasting.html。这就是使 numpy 如此神奇的原因。
    • 感谢您的反馈!我不太擅长广播,也许这个链接对我有帮助@MadPhysicist
    • 这是另一个帮助我更好地想象它的方法:docs.scipy.org/doc/numpy/user/theory.broadcasting.html。这不是一个简单的主题,但你会在一段时间后习惯它。基本思想是将右侧的形状排列起来。
    【解决方案3】:

    试试这个方法:

       def in_array(game_log, array):
            for comb in array:
                for arr in comb:
                    if game_log.all() == arr.all():
                        return True
            return False
    

    将 game_log 传递给第一个参数,将 3D 传递给下一个参数,根据我的理解,如果组合在数组中,它应该打印 True 并且 False 否则。

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

    【讨论】:

    • 您应该真正返回值而不是打印它们。您始终可以打印返回值,但如果不返回它,您将无法恢复已打印的内容。
    • 感谢修复
    猜你喜欢
    • 2018-12-03
    • 1970-01-01
    • 2016-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-04
    • 2016-03-29
    • 1970-01-01
    相关资源
    最近更新 更多