比较不同大小的2D阵列

时间:2019-11-13 19:28:37

标签: python arrays numpy

我有两个大小不同的2D阵列。

第一个数组有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中的行不匹配,依此类推... < / p>

4 个答案:

答案 0 :(得分:2)

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

isShowing

答案 1 :(得分: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))

答案 2 :(得分:1)

想要的声音:

[row in array_3 for row in array_1]

答案 3 :(得分:1)

使用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)