传递一个集合时numpy.in1d的行为是否发生了变化?

时间:2014-09-30 21:51:25

标签: python numpy

我从in1d获得了不同的行为,具体取决于我运行脚本的机器。 在我的桌面上(numpy版本1.6.2)我尝试

x = np.array('a b c d e f g h i j'.split()) 
np.in1d(x, set(['f', 'e', 'r']))
array([False, False, False, False,  True,  True, False, False, False, False], dtype=bool)

这是我的预期。在我的笔记本电脑上(版本1.8.1)结果是False,这不是我想要的。

玩了一下,我发现了

np.in1d(x, ['f', 'e', 'r'])

适用于这两个版本,但我不明白为什么在传递集合时函数不会按预期运行。

1 个答案:

答案 0 :(得分:8)

我不知道何时/是否进行了更改,但这是因为np.in1d的第二个参数必须是类似数组的。集合不是数组,因为它们不是有序的。

如果您尝试将集转换为数组,则可以(有点)看到此问题。而不是你想象的一维数组,你得到一个奇怪的0-d对象。

a = np.array(set([1, 3, 5, 6]))

print(repr(a))
# array({1, 3, 5, 6}, dtype=object)

print(a.shape)
# ()

你可能会争辩说它应该引发异常或其他东西,而不是简单地完成操作,但这就是代码当前的工作方式。它似乎不会修改np.in1d(或任何类似的函数),因此最好养成将集合转换为列表然后将它们传递给numpy函数的习惯。

在github上有关于此的现有issue