numpy 通过删除(y,2)形数组中的行来获得(x,2)形数组的补数

g52tjvyc  于 2023-04-06  发布在  其他
关注(0)|答案(1)|浏览(130)

我有两个数组,一个有大量的行,一个有少量的行,都有2列。我试图采取补充的小数组。这样,我删除所有行在较大的数组中,也存在于较小的数组。
我目前正在尝试这样做:

import numpy as np

my_arr = np.array([[0,1], [1,2], [2,3], [3,4], [4,5], [3,2]]) # all values
del_arr = np.array([[0,1], [2,3]]) # delete these from all values

complement_arr = np.delete(my_arr, del_arr, axis=0)

In[670]: complement_arr
Out[670]: 
array([[4, 5],
       [3, 2]])

可以看出,删除的行比del_arr中的行多,预期输出为:

array([[1, 2],
       [3, 4],
       [4, 5],
       [3, 2]])

我在这里到底做错了什么,以及如何有效地从更大规模的del_arr数组中删除行?

ao218c7q

ao218c7q1#

你可以通过比较del_arr中的每个形状(2,)子数组和my_arr中的每个形状(2,)子数组来使用蛮力方法:

import numpy as np

my_arr = np.array([[0,1], [1,2], [2,3], [3,4], [4,5], [3,2]]) # all values
del_arr = np.array([[0,1], [2,3]]) # delete these from all values

eq = my_arr[:, None, :] == del_arr[None, :, :]
mask = eq.all(axis=2).any(axis=1)
# mask is a shape (x,) boolean mask that indicates every row in my_arr
# that also appears in del_arr

complement_arr = my_arr[~mask]

complement_arr:

array([[1, 2],
       [3, 4],
       [4, 5],
       [3, 2]])

但是注意eq = my_arr[:, None, :] == del_arr[None, :, :]创建了一个形状为(x, y, 2)的数组,这可能需要大量的内存。

相关问题