通过删除(y,2)形状数组中的行来获取(x,2)形状数组的补码

  • 本文关键字:数组 补码 获取 删除 arrays numpy
  • 更新时间 :
  • 英文 :


我有两个数组,一个有大量的行,一个有少量的行,都有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)的数组,这可能需要大量内存。也许有更有效的选择。

最新更新