Python比较两个三维numpy数组

2024-04-24 01:31:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个纽比阵列:

A.shape = (nA,x,y)

以及

^{pr2}$

我想找到所有的子数组

A(i,:,:) == B(j,:,:).

我知道我可以写一个double for循环并使用

np.array_equal(A(i,:,:),B(j,:,:)

然而,有没有更有效的方法呢?在


Tags: 方法fornp数组equalarraydoubleshape
3条回答

您应该只需要遍历其中一个数组,因为在这之后您将找不到任何额外的唯一子数组,并且您可以通过简单的列表理解来实现这一点。在

subarrays = [x for x in A if x in B]

如果只需要索引而不是存储整个子阵列,可以执行以下操作:

^{pr2}$

您可以将^{}用于矢量化解决方案,如-

mask = ((A[:,None,:,:] == B).all(2)).all(2)
A_idx,B_idx = np.where(mask)

您可以使用^{}来避免.all()的双重用法并获得掩码,如下-

^{pr2}$

样本运行-

In [41]: # Setup input arrays and force some indices to be same between A and B
    ...: nA = 4 
    ...: nB = 5
    ...: x = 3
    ...: y = 2
    ...: 
    ...: A = np.random.randint(0,9,(nA,x,y))
    ...: B = np.random.randint(0,9,(nB,x,y))
    ...: 
    ...: A[2,:,:] = B[1,:,:]
    ...: A[3,:,:] = B[4,:,:]
    ...: 

In [42]: mask = ((A[:,None,:,:] == B).all(2)).all(2)
    ...: A_idx,B_idx = np.where(mask)
    ...: 

In [43]: A_idx, B_idx
Out[43]: (array([2, 3]), array([1, 4]))

In [44]: mask = (A.reshape(A.shape[0],1,-1) == B.reshape(B.shape[0],-1)).all(-1)
    ...: A_idx,B_idx = np.where(mask)
    ...: 

In [45]: A_idx, B_idx
Out[45]: (array([2, 3]), array([1, 4]))

利用Steven Rouk的解,这里有一种方法来获得相等的子数组的指数:

indicesForMatches = [(i,j) for i,subArrayOfA in enumerate(A) for j,subArrayOfB in enumerate(B) if np.array_equal(subArrayOfA,subArrayOfB)]

相关问题 更多 >