2011-12-11 38 views
21

我在python中使用set操作来执行两个numpy数组之间的对称差异。然而,结果是一个集合,我需要将其转换回numpy数组以向前移动。有没有办法做到这一点?下面是我的尝试:如何将python集转换为numpy数组?

a = numpy.array([1,2,3,4,5,6]) 
b = numpy.array([2,3,5]) 
c = set(a)^set(b) 

结果是一组:

In [27]: c 
Out[27]: set([1, 4, 6]) 

如果我转换为numpy的阵列,它把整组中第一个数组元素。

In [28]: numpy.array(c) 
Out[28]: array(set([1, 4, 6]), dtype=object) 

我需要什么,但是,这是这样的:

array([1,4,6],dtype=int) 

我可以遍历所有的元素逐一进行转换,但我一定要有100000元,并希望有一个内置功能保存循环。谢谢!

回答

24

的numpy的阵列没有转换为一组进行异或。直接使用setxor1d

>>> import numpy 
>>> a = numpy.array([1,2,3,4,5,6]) 
>>> b = numpy.array([2,3,5]) 
>>> numpy.setxor1d(a, b) 
array([1, 4, 6]) 
+0

当比较次数很大时,是否使用了numpy set例程,比如'setxor1d',坏了?也许是一个新问题,但我认为这个答案非常相关。在我的情况下,我将拥有10万个+集合操作的100k个对象。 – Annan

26

务必:

>>> numpy.array(list(c)) 
array([1, 4, 6]) 

而D型为int(在我身边的Int64)

+0

谢谢蒂托!现在我看到KennyTM有一个更有效的答案,但你的工作也很好! – mishaF

+4

这实际上回答了标题中的问题。 –

5

试试这个。

numpy.array(list(c)) 

在初始化numpy数组之前转换为列表会将各个元素设置为整数而不是第一个元素作为对象。