【问题标题】:Compare 2D arrays of different size [duplicate]比较不同大小的二维数组[重复]
【发布时间】:2020-03-09 16:08:13
【问题描述】:

我有两个不同大小的二维数组。

第一个数组有 3 行 7 列 第二个数组有60行7列

array_1 = 
[[0., 0., 0., 0., 1., 1., 1.],
 [1., 0., 1., 0., 0., 1., 0.],
 [1., 1., 1., 0., 1., 0., 0.]]
array_3 =
[[0., 0., 0., 0., 0., 0., 0.],
 [0., 0., 0., 0., 0., 1., 1.],
 [0., 0., 0., 0., 1., 0., 0.],
 [0., 0., 0., 1., 0., 0., 0.],
 [0., 0., 0., 1., 0., 1., 1.],
 [0., 0., 0., 1., 1., 0., 0.],
 [0., 0., 0., 1., 1., 1., 1.],
 [0., 0., 1., 0., 0., 0., 0.],
 [0., 0., 1., 0., 0., 1., 1.],
 [0., 0., 1., 0., 1., 0., 0.],
 [0., 0., 1., 0., 1., 1., 1.],
 [0., 0., 1., 1., 0., 0., 0.],
 [0., 0., 1., 1., 0., 1., 1.],
 [0., 0., 1., 1., 1., 0., 0.],
 [0., 0., 1., 1., 1., 1., 1.],
 [0., 1., 0., 0., 0., 0., 0.],
 [0., 1., 0., 0., 0., 1., 0.],
 [0., 1., 0., 0., 1., 0., 1.],
 [0., 1., 0., 0., 1., 1., 1.],
 [0., 1., 0., 1., 0., 0., 0.],
 [0., 1., 0., 1., 0., 1., 0.],
 [0., 1., 0., 1., 1., 0., 1.],
 [0., 1., 0., 1., 1., 1., 1.],
 [0., 1., 1., 0., 0., 0., 0.],
 [0., 1., 1., 0., 0., 1., 0.],
 [0., 1., 1., 0., 1., 0., 1.],
 [0., 1., 1., 0., 1., 1., 1.],
 [0., 1., 1., 1., 0., 1., 0.],
 [0., 1., 1., 1., 1., 0., 1.],
 [0., 1., 1., 1., 1., 1., 1.],
 [1., 0., 0., 0., 0., 0., 0.],
 [1., 0., 0., 0., 0., 1., 0.],
 [1., 0., 0., 0., 1., 1., 0.],
 [1., 0., 0., 1., 0., 0., 1.],
 [1., 0., 0., 1., 0., 1., 1.],
 [1., 0., 0., 1., 1., 0., 1.],
 [1., 0., 0., 1., 1., 1., 1.],
 [1., 0., 1., 0., 0., 0., 0.],
 [1., 0., 1., 0., 0., 1., 0.],
 [1., 0., 1., 0., 1., 0., 0.],
 [1., 0., 1., 0., 1., 1., 0.],
 [1., 0., 1., 1., 0., 0., 1.],
 [1., 0., 1., 1., 0., 1., 1.],
 [1., 0., 1., 1., 1., 0., 1.],
 [1., 0., 1., 1., 1., 1., 1.],
 [1., 1., 0., 0., 0., 0., 0.],
 [1., 1., 0., 0., 0., 1., 0.],
 [1., 1., 0., 0., 1., 0., 0.],
 [1., 1., 0., 0., 1., 1., 0.],
 [1., 1., 0., 1., 0., 1., 0.],
 [1., 1., 0., 1., 1., 0., 0.],
 [1., 1., 0., 1., 1., 1., 0.],
 [1., 1., 1., 0., 0., 0., 1.],
 [1., 1., 1., 0., 0., 1., 1.],
 [1., 1., 1., 0., 1., 0., 1.],
 [1., 1., 1., 0., 1., 1., 1.],
 [1., 1., 1., 1., 0., 0., 1.],
 [1., 1., 1., 1., 0., 1., 1.],
 [1., 1., 1., 1., 1., 0., 1.],
 [1., 1., 1., 1., 1., 1., 1.]]

目前我有这样的功能:

def compare(arr_1, arr_2):
    return arr_1 == arr_2.all(axis=1)

仅返回 False 值。

我希望该函数将array_1 中的行与array_2 中的行进行比较,主要是查看array_1 中的任何行是否与array_2 中的任何行匹配。

理想情况下,布尔数组可以如下表示:[True, False, True]

基本上表示array_1中的第0行匹配array_2中的一行,array_1中的第1行不匹配array_2中的一行,等等......

【问题讨论】:

  • 我完全不明白您的预期/预期输出是什么。你最后一句的解释很难理解。
  • 10 或 3,请选择一个。您的问题充其量是不一致的
  • 另外,这些也不是二进制数组。他们非常浪费地使用 float 而不是 bool dtype。
  • 抱歉,我编辑了这个问题,希望现在更清楚了。谢谢。
  • [(array_3 == array_1[i]).all(1).any() for i in range(len(array_1))]

标签: python arrays numpy


【解决方案1】:

您可以使用以下函数来解决此问题。 它将遍历第一个数组,并检查该行是否存在于第二个数组中,最后将答案存储在结果变量中。

def compare_arrays(arr_1, arr_2):
    result = []
    for row in arr_1:
        result.append(row in arr_2)
    return result

【讨论】:

    【解决方案2】:

    听起来像你想要的:

    [row in array_3 for row in array_1]
    

    【讨论】:

      【解决方案3】:

      为了检查2d 数组的成员资格,一种方法是将它们视为一维数组。所以我们可以获取两个数组的1d 视图,并使用np.in1d 来查找给定数组中的哪些行包含在另一个数组中:

      def view_as1d(a):
          return a.view(np.dtype((np.void, a.dtype.itemsize * a.shape[-1])))
      
      np.in1d(view_as1d(array_1), view_as1d(array_3))
      

      【讨论】:

        【解决方案4】:

        all 正处于正确的轨道上,但您还需要跨行使用 any。您可以通过新的维度和广播来实现这一目标。

        首先创建一个 3x60x7 数组,其中包含 arr1arr2 的每一行之间的匹配项:

         m = (arr1[:, None, ...] == arr2[None, ...])
        

        然后计算整行是否匹配:

         n = m.all(axis=-1)
        

        现在您可以检查arr2 中是否有针对arr1 中的每一行的完整行匹配:

         result = n.any(axis=-1)
        

        作为单行:

         (arr1[:, None, ...] == arr2[None, ...]).all(axis=-1).any(axis=-1)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-10-14
          • 1970-01-01
          • 2011-05-05
          • 2015-02-10
          • 1970-01-01
          • 2021-04-20
          相关资源
          最近更新 更多