我有两个数组,一个有大量的行,一个有少量的行,都有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
数组在更大的规模?
您可以通过比较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)
的数组,这可能需要大量内存。也许有更有效的选择。