2012-04-04 37 views
68

Nota: Esto es pedir el reverso de la conversión normal de tupla a arreglo.Convertir numpy array en tupla

Tengo que pasar un argumento a una función (wrap C++) como una tupla anidada. Por ejemplo, las siguientes obras

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

mientras que el siguiente No

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

Por desgracia, el argumento me gustaría utilizar viene a mí como una matriz numpy. Esa matriz siempre tiene dimensiones 2xN para algunos N, que pueden ser bastante grandes.

¿Hay alguna manera fácil de convertir eso en una tupla? Sé que podría pasar, creando una nueva tupla, pero preferiría si hay algún buen acceso que brinde la matriz numpy.

Si no es posible hacerlo tan bien como espero, ¿cuál es la forma más bonita de hacerlo mediante bucles, o lo que sea?

Respuesta

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

Aquí es una función que va a hacer es:

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

Y un ejemplo:

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

Buena generalización. Sin embargo, como novato de Python, me pregunto si se considera bueno usar excepciones para una condición que es casi tan común como el estado no excepcional. Al menos en C++, el control de flujo por excepciones suele desaprobarse. ¿Sería mejor probar si 'tipo (a) == numpy.ndarray'? – Mike

+8

Esto es bastante común en python debido al concepto de "pato-tipado" y EAFT, más aquí: http://docs.python.org/glossary.html#term-duck-typing. La ventaja de este enfoque es que convertirá cualquier secuencia anidada en tuplas anidadas, no solo en una matriz. Una cosa que debería haber hecho que he solucionado es especificar qué errores quiero que maneje el bloque except. –

+2

En C++, las excepciones son lentas en relación con las condicionales por una variedad de razones. En Python, son aproximadamente los mismos en términos de rendimiento: este es uno de los lugares en los que tenemos que comprobar nuestras intuiciones de C++ en la puerta. – dbn

0

que no estaba satisfecho, por lo que finalmente utilizó la siguiente:

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' sé si es más rápido, pero parece más eficaz;)

+2

Esa no era la forma que quería para la tupla. – Mike

1

Otra opción

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

Si estás de paso matrices NumPy a funciones de C++, es posible que también desee buscar en el uso Cython o TRAGO.

+0

Eso no se convierte en tupla. Convierte a una lista? – Peter

+0

¿Lo has intentado? Hace una tupla cuando corro. Tenga en cuenta que la última función llamada es tupla, que devuelve una tupla. Si solo tiene la [...] parte sin la tupla externa, obtendrá una lista de tuplas. –

+0

Hmm, lo siento; tienes razón. Anoche tuve un poco de sueño y vi una lista, así que sí, debe haber sido una lista con una tupla dentro. – Peter