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


Примечание: это требует обратного обычного преобразования кортежа в массив.

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

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

, а после не

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

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

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

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

4 80

4 ответа:

>>> arr = numpy.array(((2,2),(2,-2)))
>>> tuple(map(tuple, arr))
((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))

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

>>> 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)

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

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

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

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