Ответ 1
>>> arr = numpy.array(((2,2),(2,-2)))
>>> tuple(map(tuple, arr))
((2, 2), (2, -2))
Примечание.. Это запрос об обратном преобразовании обычного набора в массив.
Мне нужно передать аргумент функции (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.
Если это невозможно сделать так же хорошо, как я надеюсь, какой самый красивый способ сделать это путем циклирования или что-то еще?
>>> 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))
Другой вариант
tuple([tuple(row) for row in myarray])
Если вы передаете массивы NumPy в функции С++, вы также можете посмотреть на использование Cython или SWIG.
Я не был удовлетворен, поэтому я, наконец, использовал это:
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)
Я не знаю, быстрее ли это, но выглядит более эффективно;)