代码之家  ›  专栏  ›  技术社区  ›  THN

删除列表中包含的numpy行?

  •  3
  • THN  · 技术社区  · 6 年前

    我有一个numpy数组和一个列表。我要删除列表中包含的行。

    a = np.zeros((3, 2))
    a[0, :] = [1, 2]
    l = [(1, 2), (3, 4)]
    

    a set 创建自 l ,类似于:

    sa = set(map(tuple, a))
    sl = set(l)
    np.array(list(sa - sl))
    

    或者更简单

    sl = set(l)
    np.array([row for row in list(map(tuple, a)) if row not in sl]
    

    1 回复  |  直到 6 年前
        1
  •  1
  •   Divakar    6 年前

    进近#1: views (将每一行视为一个元素,每个元素都具有扩展的数据类型)-

    # 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()
    
    a1D,l1D = view1D(a,l)
    out = a[np.in1d(a1D,l1D,invert=True)]
    

    如果您只需要在输出中有唯一的行 set np.unique 在获得的输出上-

    np.unique(out,axis=0)
    

    In [72]: a
    Out[72]: 
    array([[1, 2],
           [0, 0],
           [0, 0]])
    
    In [73]: l
    Out[73]: [(1, 2), (3, 4)]
    
    In [74]: out
    Out[74]: 
    array([[0, 0],
           [0, 0]])
    In [75]: np.unique(out,axis=0)
    Out[75]: array([[0, 0]])
    

    进近#2: 使用相同的降维哲学,这里的矩阵乘法特定于 int

    l = np.asarray(l)
    shp = np.maximum(a.max(0)+1,l.max(0)+1)
    s = np.r_[shp[::-1].cumprod()[::-1][1:],1]
    l1D = l.dot(s)
    a1D = a.dot(s)
    l1Ds = np.sort(l1D)
    out = a[l1D[np.searchsorted(l1Ds,a1D)] != a1D]