据我所知,在numpy的包的数组元素可以通过np.isin
功能受到歧视。
例如:
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
不存在于其他阵列,其形状不同的任何有效的方式?
我怀疑,这个问题是与你的第二个参数[B, C]
如何传递。该docs说
针对其值要测试元件的每个值。如果它是一个数组或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)