比较不同大小的二维数组

4

我有两个不同尺寸的二维数组。

第一个数组有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中的一个。你的问题最好保持一致。 - Mad Physicist
此外,它们并不完全是二进制数组。它们非常浪费地使用了float类型而不是bool类型。 - Mad Physicist
[(array_3 == array_1[i]).all(1).any() for i in range(len(array_1))] - splash58
@MadPhysicist 适用于nd数组,不仅限于2D数组 - https://dev59.com/b7Hma4cB1Zd3GeqPUP8P。 - Divakar
@MadPhysicist 不用担心。一切都回到了应该在的地方。谢谢! - Divakar
显示剩余5条评论
4个回答

2
您可以使用以下函数来解决这个问题。它将遍历第一个数组,并检查该行是否存在于第二个数组中,最后将答案存储在结果变量中。
def compare_arrays(arr_1, arr_2):
    result = []
    for row in arr_1:
        result.append(row in arr_2)
    return result

1
为了检查 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))

1
听起来你想要的是:

[row in array_3 for row in array_1]

1
你在使用all方面是正确的,但你还需要在行之间使用any。你可以通过创建一个新的维度和广播来实现。
首先创建一个3x60x7的数组,其中包含arr1arr2每一行之间的匹配结果:
 m = (arr1[:, None, ...] == arr2[None, ...])

然后计算整行是否匹配:
 n = m.all(axis=-1)

现在您可以检查 arr1 中的每一行是否与 arr2 中的整行匹配:
 result = n.any(axis=-1)

作为一行代码:
 (arr1[:, None, ...] == arr2[None, ...]).all(axis=-1).any(axis=-1)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接