Примечание: требуется обратное обычному преобразованию кортежа в массив.
Мне нужно передать аргумент функции (обернутой 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.
Если это невозможно сделать так хорошо, как я надеюсь, какой самый красивый способ сделать это с помощью цикла или чего-то еще?
tuple(arr)
Вот функция, которая это сделает:
И пример:
источник
type(a)==numpy.ndarray
?Мне это не понравилось, поэтому я наконец использовал это:
Не знаю, быстрее ли, но выглядит эффективнее;)
источник
Другой вариант
Если вы передаете массивы NumPy функциям C ++, вы также можете использовать Cython или SWIG.
источник
list
, опустив квадратные скобки, то есть используяtuple(tuple(row) for row in myarray)
Если вам нравятся длинные сокращения, вот еще один способ tuple (tuple (a_m.tolist ()) для a_m в a)
Результатом будет ((1, 2), (3, 4))
Обратите внимание, что просто (tuple (a_m.tolist ()) для a_m в a) даст выражение генератора. Вроде как вдохновленный комментарием @ norok2 к ответу Грега фон Винкеля
источник