2011-12-11 41 views
21

Estoy usando una operación set en python para realizar una diferencia simétrica entre dos matrices numpy. El resultado, sin embargo, es un conjunto y necesito convertirlo nuevamente a una matriz numpy para seguir adelante. ¿Hay alguna forma de hacer esto? Esto es lo que he intentado:¿Cómo convertir un conjunto de python a una matriz numpy?

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

El resultado es un conjunto:

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

Si convierto en una matriz numpy, se coloca todo el conjunto en el primer elemento de la matriz.

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

Lo que necesito, sin embargo, sería la siguiente:

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

pude bucle sobre los elementos para convertir uno por uno, pero voy a tener 100.000 elementos y esperado una función incorporada para guardar el bucle ¡Gracias!

Respuesta

24

No convierta la matriz numpy a un conjunto para llevar a cabo o-exclusiva. Use setxor1d directamente.

>>> 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

¿Está mal el uso de rutinas numpy set, como 'setxor1d', cuando el número de comparaciones es grande? Tal vez una nueva pregunta, pero muy relacionada con esta respuesta, creo. En mi caso tendré 100k objetos con 10m + operaciones de conjunto. – Annan

26

Do:

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

Y dtype es int (Int64 de mi lado.)

+0

Gracias Tito! Ahora veo que KennyTM tuvo una respuesta más eficiente, ¡pero la tuya también funcionó bien! – mishaF

+4

Esto realmente responde la pregunta en el título. –

5

Pruebe esto.

numpy.array(list(c)) 

la conversión a la lista antes de inicializar array numpy fijaría los elementos individuales a un entero en lugar del primer elemento como el objeto.

Cuestiones relacionadas