2012-04-04 33 views
68

Nota: Si tratta del contrario della normale conversione da tupla a matrice.Converte array numpy in tupla

Devo passare un argomento a una funzione (spostata in C++) come una tupla annidata. Per esempio: oggetti

X = MyFunction(((2,2),(2,-2))) 

, mentre il seguente quanto segue Non

X = MyFunction(numpy.array(((2,2),(2,-2)))) 
X = MyFunction([[2,2],[2,-2]]) 

Purtroppo, l'argomento vorrei usare viene a me come un array NumPy. Quella matrice ha sempre dimensioni 2xN per alcuni N, che possono essere abbastanza grandi.

C'è un modo semplice per convertirlo in una tupla? So che potrei semplicemente andare in loop, creando una nuova tupla, ma preferirei se ci fosse un accesso piacevole fornito dall'array numpy.

Se non è possibile farlo così bene come spero, qual è il modo più bello per farlo in loop, o qualsiasi altra cosa?

risposta

83
>>> arr = numpy.array(((2,2),(2,-2))) 
>>> tuple(map(tuple, arr)) 
((2, 2), (2, -2)) 
17

Ecco una funzione che farò:

def totuple(a): 
    try: 
     return tuple(totuple(i) for i in a) 
    except TypeError: 
     return a 

E un esempio:

>>> array = numpy.array(((2,2),(2,-2))) 
>>> totuple(array) 
((2, 2), (2, -2)) 
+1

Bella generalizzazione. Come novizio pitone, però, mi chiedo se sia considerato un buon stile usare le eccezioni per una condizione che è quasi comune come lo stato non eccezionale. Almeno in C++, il controllo del flusso per eccezioni è solitamente disapprovato. Sarebbe meglio testare se 'type (a) == numpy.ndarray'? – Mike

+8

Questo è piuttosto comune in Python a causa del concetto di "duck-typing" e EAFT, più qui: http://docs.python.org/glossary.html#term-duck-typing. Il vantaggio di questo approccio è che convertirà ogni sequenza nidificata in tuple annidate, non solo in una matrice. Una cosa che avrei dovuto risolvere è specificare quali errori voglio gestire dal blocco eccetto. –

+2

In C++, le eccezioni sono lente rispetto ai condizionali per una serie di motivi. In Python, sono approssimativamente uguali in termini di prestazioni: questo è uno dei punti in cui dobbiamo controllare le nostre intuizioni C++ alla porta. – dbn

0

non ero soddisfatto, così ho finalmente usato questo:

.210

i: a = numpy.array ([[1,2,3], [4,5,6]])

i: un

o: array ([[1, 2, 3 ], [4, 5, 6]])

i: tupla (a.reshape (1, -1) [0])

o: (1, 2, 3, 4, 5, 6)

I don' so se è più veloce, ma sembra più efficace;)

+2

Questa non era la forma che volevo per la tupla. – Mike

1

Un'altra opzione

tuple([tuple(row) for row in myarray]) 

Se siete di passaggio array NumPy a funzioni C++, si potrebbe anche voler guardare con Cython o SWIG.

+0

Che non converte in tupla. Converte in una lista? – Peter

+0

Hai provato? Fa una tupla quando corro dentro. Nota che l'ultima funzione chiamata è tupla, che restituisce una tupla. Se hai solo la [...] parte senza la tupla esterna, otterrai una lista di tuple. –

+0

Hmm mi dispiace per quello; hai ragione. Ero un po 'assonnato la notte scorsa e ho visto una lista restituita quindi sì, dev'essere stata una lista con una tupla dentro. – Peter