2011-12-11 26 views
21

Sto usando un'operazione set in python per eseguire una differenza simmetrica tra due array numpy. Il risultato, tuttavia, è un set e ho bisogno di riconvertirlo in una serie numpy per andare avanti. C'è un modo per fare questo? Ecco quello che ho provato:Come convertire un set python in un array numpy?

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

Il risultato è un insieme:

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

Se converto a un array NumPy, si pone l'intero set nel primo elemento dell'array.

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

Che cosa ho bisogno, tuttavia, sarebbe questo:

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

potevo ciclo sugli elementi di convertire uno per uno, ma avrò 100.000 elementi e sperato in una funzione built-in per salvare il ciclo. Grazie!

risposta

24

Non convertire la matrice NumPy ad un insieme di eseguire esclusivo o. Utilizzare direttamente 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

Sta usando le routine di numpy set, come 'setxor1d', quando il numero dei confronti è grande? Forse una nuova domanda, ma molto legata a questa risposta, penso. Nel mio caso avrò 100k oggetti con 10m + operazioni set. – Annan

26

Do:

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

E DTYPE è int (Int64 dalla mia parte.)

+0

Grazie Tito! Ora vedo KennyTM avere una risposta più efficiente, ma anche il tuo ha funzionato bene! – mishaF

+4

Questo in realtà risponde alla domanda nel titolo. –

5

Prova questo.

numpy.array(list(c)) 

Conversione elencare prima di inizializzare matrice NumPy fisserebbe i singoli elementi a intero piuttosto che il primo elemento come oggetto.

Problemi correlati