检查阵列的元素是专用于其它的多个阵列

问题描述 投票:2回答:1

据我所知,在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不存在于其他阵列,其形状不同的任何有效的方式?

python arrays python-3.x numpy
1个回答
0
投票

我怀疑,这个问题是与你的第二个参数[B, C]如何传递。该docs

针对其值要测试元件的每个值。如果它是一个数组或array_like该参数被平坦化。请参见与非数组参数等行为注意事项。

和注意事项:

elementtest_elements转换为数组,如果他们不已经。如果test_elementsset(或其他非序列集合)将被转换为对象阵列的一个元件,而不是包含在所述test_elements值的阵列。这是处理非序列集合数组构造的方式造成的。设定转换到一个列表通常给出期望的行为。

这意味着你的情况是,第一个例子,它包含B且长度相等C被正确地解释为整数的2D阵列(其然后弄清至1D)。在第二示例中,BC具有不同的尺寸。因为你不能有一个粗糙的阵列,则结果成为包含两个元素,其中的每一个是一个阵列的对象阵列。因为没有你的A元素是一个数组,所有的比较都是False

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

np.isin(A, np.concatenate((B, C)), invert=True)
© www.soinside.com 2019 - 2024. All rights reserved.