Преобразование массива numpy в кортеж

Примечание.. Это запрос об обратном преобразовании обычного набора в массив.

Мне нужно передать аргумент функции (wrapped С++) в виде вложенного кортежа. Например, следующие работы

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

тогда как

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

К сожалению, аргумент, который я хотел бы использовать, приходит ко мне как массив numpy. Этот массив всегда имеет размеры 2xN для некоторого N, что может быть довольно большим.

Есть ли простой способ преобразовать это в кортеж? Я знаю, что я мог бы просто пропустить, создав новый кортеж, но предпочел бы, если бы там был хороший доступ к массиву numpy.

Если это невозможно сделать так же хорошо, как я надеюсь, какой самый красивый способ сделать это путем циклирования или что-то еще?

Ответ 1

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

Ответ 2

Вот функция, которая сделает это:

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

И пример:

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

Ответ 3

Другой вариант

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

Если вы передаете массивы NumPy в функции С++, вы также можете посмотреть на использование Cython или SWIG.

Ответ 4

Я не был удовлетворен, поэтому я, наконец, использовал это:

  

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

         

i: a

         

o: массив ([[1, 2, 3],            [4, 5, 6]])

         

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

         

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

  

Я не знаю, быстрее ли это, но выглядит более эффективно;)