检查数组的元素是否为其他多个数组所独占

时间:2019-02-04 14:41:00

标签: python arrays python-3.x numpy

据我所知,可以通过np.isin函数来区分numpy包数组中的元素。

例如:

In:
A = np.array([1,2,3,4,5])
B = np.array([6,7,8,9,1])
C = np.array([6,7,1,2,4])
~np.isin(A , [B, C])

Out:
array([ False, False, True, False, True])

在这种情况下,由于三个比较数组中的3个和5个都不存在,所以我知道输出将如上所示。

但是,如果我像这样使它有所不同:

In:
A = np.array([1,2,3,4,5])
B = np.array([6,7,8,9,1,3])
C = np.array([6,7,1,2,4])
~np.isin(A , [B, C])

Out:
array([ True,  True,  True,  True,  True])

而不是我所期望的:

array([False, False, False, False,  True])

经过测试,我知道将np.nan放在数组C中会很好。

但是有没有一种有效的方法来检查数组A中的元素是否在形状不同的其他数组中不存在?

1 个答案:

答案 0 :(得分:0)

我怀疑问题出在您如何传递第二个参数[B, C]docs

  

用于测试元素的每个值的值。如果它是array或array_like,则将其展平。有关非数组类参数的行为,请参见注释。

注意事项:

  

elementtest_elements尚未转换为数组。如果test_elementsset(或其他非序列集合),它将被转换为带有一个元素的对象数组,而不是test_elements中包含的值的数组。这是数组构造函数处理非序列集合的方式的结果。将集合转换为列表通常可以实现所需的行为。

在您的情况下,这意味着第一个包含相等长度的BC的示例被正确地解释为2D整数数组(然后被精简为1D)。在第二个示例中,BC具有不同的大小。由于不能有一个不整齐的数组,结果将成为一个包含两个元素的对象数组,每个元素都是一个数组。由于您的A元素都不是数组,因此所有比较都是False

一种解决方法是正确地预先构建预期的输入:

np.isin(A, np.concatenate((B, C)), invert=True)