check for identical rows in different numpy arrays

后端 未结 6 811
无人共我
无人共我 2020-11-28 15:14

how do I get a row-wise comparison between two arrays, in the result of a row-wise true/false array?

Given datas:

a = np.array([[1,0],[2,0],[3,1],[         


        
6条回答
  •  青春惊慌失措
    2020-11-28 16:11

    Approach #1

    We could use a view based vectorized solution -

    # https://stackoverflow.com/a/45313353/ @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)
    

    Sample run -

    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])
    

    Approach #2

    Alternatively for the case when all rows in b are in a and rows are lexicographically sorted, using the same views, but with searchsorted -

    out = np.zeros(len(A), dtype=bool)
    out[np.searchsorted(A,B)] = 1
    

    If the rows are not necessarily lexicographically sorted -

    sidx = A.argsort()
    out[sidx[np.searchsorted(A,B,sorter=sidx)]] = 1
    

提交回复
热议问题