检查不同的numpy数组中的相同行

Tom*_*omK 5 python arrays numpy

我如何获得两个数组之间的按行比较,从而得到按行的真/假数组?

给定数据:

a = np.array([[1,0],[2,0],[3,1],[4,2]])
b = np.array([[1,0],[2,0],[4,2]])
Run Code Online (Sandbox Code Playgroud)

结果步骤1:

c = np.array([True, True,False,True])
Run Code Online (Sandbox Code Playgroud)

最终结果:

a = a[c]
Run Code Online (Sandbox Code Playgroud)

那么我如何获得阵列呢c

PS:在此示例中,数组ab 进行了排序,如果您的解决方案中数组的排序很重要,请提供信息

Ome*_*ham 6

您可以将 numpy 与 apply_along_axis 一起使用(特定轴上的迭代类型,而 axis=0 在每个单元格上迭代,axis=1 在每一行上迭代,axis=2 在矩阵上等等

import numpy as np
a = np.array([[1,0],[2,0],[3,1],[4,2]])
b = np.array([[1,0],[2,0],[4,2]])
c = np.apply_along_axis(lambda x,y: x in y, 1, a, b)
Run Code Online (Sandbox Code Playgroud)


Div*_*kar 6

方法#1

我们可以使用view基于矢量化的解决方案 -

# /sf/answers/3171934741/ @Divakar
def view1D(a, b): # a, b are arrays
    a = np.ascontiguousarray(a)
    b = np.ascontiguousarray(b)
    void_dt = np.dtype((np.void, a.dtype.itemsize * a.shape[1]))
    return a.view(void_dt).ravel(),  b.view(void_dt).ravel()

A,B = view1D(a,b)
out = np.isin(A,B)
Run Code Online (Sandbox Code Playgroud)

样品运行 -

In [8]: a
Out[8]: 
array([[1, 0],
       [2, 0],
       [3, 1],
       [4, 2]])

In [9]: b
Out[9]: 
array([[1, 0],
       [2, 0],
       [4, 2]])

In [10]: A,B = view1D(a,b)

In [11]: np.isin(A,B)
Out[11]: array([ True,  True, False,  True])
Run Code Online (Sandbox Code Playgroud)

方法#2

或者为案件时,所有行b都是a和行字典顺序排序,使用相同的views,但是searchsorted-

out = np.zeros(len(A), dtype=bool)
out[np.searchsorted(A,B)] = 1
Run Code Online (Sandbox Code Playgroud)

如果行不一定按字典顺序排序 -

sidx = A.argsort()
out[sidx[np.searchsorted(A,B,sorter=sidx)]] = 1
Run Code Online (Sandbox Code Playgroud)


jpp*_*jpp 5

这是向量化的解决方案:

res = (a[:, None] == b).all(-1).any(-1)

print(res)

array([ True,  True, False,  True])
Run Code Online (Sandbox Code Playgroud)

请注意,a[:, None] == b将的每行a与按b元素进行比较。然后,我们使用all+ any来推断True每个子数组是否有所有行:

print(a[:, None] == b)

[[[ True  True]
  [False  True]
  [False False]]

 [[False  True]
  [ True  True]
  [False False]]

 [[False False]
  [False False]
  [False False]]

 [[False False]
  [False False]
  [ True  True]]]
Run Code Online (Sandbox Code Playgroud)