Note: Ceci demande l'inverse de la conversion habituelle Tuple-to-array.
Je dois passer un argument à une fonction (enveloppée c ++) en tant que Tuple imbriqué. Par exemple, les travaux suivants
X = MyFunction( ((2,2),(2,-2)) )
alors que ce qui suit ne le fait pas
X = MyFunction( numpy.array(((2,2),(2,-2))) )
X = MyFunction( [[2,2],[2,-2]] )
Malheureusement, l'argument que je voudrais utiliser me vient comme un tableau numpy. Ce tableau a toujours des dimensions 2xN pour certains N, ce qui peut être assez grand.
Y at-il un moyen facile de convertir cela en un tuple? Je sais que je pourrais simplement créer un nouveau tuple, mais je préférerais que le tableau numpy offre un accès agréable.
Si ce n'est pas possible de le faire aussi bien que j'espère, quelle est la meilleure façon de le faire en boucle, ou peu importe?
>>> arr = numpy.array(((2,2),(2,-2)))
>>> Tuple(map(Tuple, arr))
((2, 2), (2, -2))
Voici une fonction qui va le faire:
def totuple(a):
try:
return Tuple(totuple(i) for i in a)
except TypeError:
return a
Et un exemple:
>>> array = numpy.array(((2,2),(2,-2)))
>>> totuple(array)
((2, 2), (2, -2))
Je n'étais pas satisfait, alors j'ai finalement utilisé ceci:
>>> a=numpy.array([[1,2,3],[4,5,6]])
>>> a
array([[1, 2, 3],
[4, 5, 6]])
>>> Tuple(a.reshape(1, -1)[0])
(1, 2, 3, 4, 5, 6)
Je ne sais pas si c'est plus rapide, mais ça a l'air plus efficace;)
Une autre option
Tuple([Tuple(row) for row in myarray])
Si vous passez des tableaux NumPy à des fonctions C++, vous pouvez également envisager d’utiliser Cython ou SWIG.