从更多维的numpy数组中查找和删除

a.j*_*eed 6 python arrays numpy

我有两个numpy数组:

p_a_colors=np.array([[0,0,0],
                     [0,2,0],
                     [119,103,82],
                     [122,122,122],
                     [122,122,122],
                     [3,2,4]])

p_rem = np.array([[119,103,82],
                     [122,122,122]])
Run Code Online (Sandbox Code Playgroud)

我想删除p_rem中p_a_colors中的所有列,所以我得到:

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

我认为,有些东西应该像

p_r_colors= np.delete(p_a_colors, np.where(np.all(p_a_colors==p_rem, axis=0)),0)
Run Code Online (Sandbox Code Playgroud)

但我只是没有得到轴或[:]正确.

我知道

p_r_colors=copy.deepcopy(p_a_colors)
for i in range(len(p_rem)):
    p_r_colors= np.delete(p_r_colors, np.where(np.all(p_r_colors==p_rem[i], axis=-1)),0)
Run Code Online (Sandbox Code Playgroud)

会工作,但我试图避免(python)循环,因为我也希望性能正确.

Jai*_*ime 7

我就是这样做的:

dtype = np.dtype((np.void, (p_a_colors.shape[1] * 
                            p_a_colors.dtype.itemsize)))
mask = np.in1d(p_a_colors.view(dtype), p_rem.view(dtype))
p_r_colors = p_a_colors[~mask]

>>> p_r_colors
array([[0, 0, 0],
       [0, 2, 0],
       [3, 2, 4]])
Run Code Online (Sandbox Code Playgroud)

您需要执行void dtype事务,以便numpy将行作为一个整体进行比较.之后使用内置的设置例程似乎是显而易见的方法.