据我所知,可以通过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
中的元素是否在形状不同的其他数组中不存在?
答案 0 :(得分:0)
我怀疑问题出在您如何传递第二个参数[B, C]
。 docs说
用于测试元素的每个值的值。如果它是array或array_like,则将其展平。有关非数组类参数的行为,请参见注释。
注意事项:
element
和test_elements
尚未转换为数组。如果test_elements
是set
(或其他非序列集合),它将被转换为带有一个元素的对象数组,而不是test_elements
中包含的值的数组。这是数组构造函数处理非序列集合的方式的结果。将集合转换为列表通常可以实现所需的行为。
在您的情况下,这意味着第一个包含相等长度的B
和C
的示例被正确地解释为2D整数数组(然后被精简为1D)。在第二个示例中,B
和C
具有不同的大小。由于不能有一个不整齐的数组,结果将成为一个包含两个元素的对象数组,每个元素都是一个数组。由于您的A
元素都不是数组,因此所有比较都是False
。
一种解决方法是正确地预先构建预期的输入:
np.isin(A, np.concatenate((B, C)), invert=True)