我有两个大小不同的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>
答案 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数组,其中包含arr1
和arr2
每行之间的匹配项:
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)