我从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'])
适用于这两个版本,但我不明白为什么在传递集合时函数不会按预期运行。
答案 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。