numpy 배열을 튜플로 변환


108

참고 : 이것은 일반적인 tuple-to-array 변환의 반대를 요구합니다.

(래핑 된 C ++) 함수에 중첩 된 튜플로 인수를 전달해야합니다. 예를 들어, 다음 작품

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

다음 은 그렇지 않습니다

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

불행히도 내가 사용하고 싶은 인수는 나에게 numpy 배열로 온다. 이 배열은 항상 일부 N에 대해 2xN 차원을 가지며 이는 상당히 클 수 있습니다.

그것을 튜플으로 변환하는 쉬운 방법이 있습니까? 나는 새 튜플을 생성하여 루프를 돌릴 수 있다는 것을 알고 있지만 numpy 배열이 제공하는 멋진 액세스가 있으면 선호합니다.

내가 바라는 것만 큼 멋지게 할 수 없다면, 루핑으로하는 가장 예쁜 방법은 무엇입니까?

답변:



26

다음은이를 수행 할 함수입니다.

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

1
좋은 일반화. 하지만 파이썬 초보자로서 저는 예외가 아닌 상태만큼이나 일반적인 조건에 대해 예외를 사용하는 것이 좋은 스타일로 간주되는지 궁금합니다. 적어도 C ++에서는 예외에 의한 흐름 제어가 일반적으로 눈살을 찌푸립니다. 다음을 테스트하는 것이 더 낫 type(a)==numpy.ndarray습니까?
Mike

9
이 때문에 자세한 내용은 여기 "오리 입력"및 EAFT의 개념의 파이썬에서 꽤 일반적입니다 docs.python.org/glossary.html#term-duck-typing . 이 접근 방식의 장점은 모든 중첩 시퀀스를 배열뿐만 아니라 중첩 된 튜플로 변환한다는 것입니다. 내가 고쳐야 할 한 가지는 except 블록에서 처리 할 오류를 지정하는 것입니다.
Bi Rico

3
C ++에서 예외는 다양한 이유로 조건문에 비해 느립니다. Python에서는 성능 측면에서 거의 동일합니다. 이것은 우리가 C ++ 직관을 확인해야하는 장소 중 하나입니다.
dbn

8

나는 만족스럽지 않아 마침내 이것을 사용했습니다.

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

더 빠른지 모르겠지만 더 효과적입니다.)


3
그것은 내가 튜플에 원하는 모양이 아닙니다.
Mike

5

다른 옵션

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

NumPy 배열을 C ++ 함수에 전달하는 경우 Cython 또는 SWIG 사용을 살펴볼 수도 있습니다.


그것은 튜플로 변환되지 않습니다. 목록으로 변환 하시겠습니까?
피터

해봤 어? 내가 실행할 때 튜플을 만듭니다. 마지막으로 호출 된 함수는 튜플을 반환하는 튜플입니다. 외부 튜플없이 [...] 부분 만 있으면 튜플 목록을 얻을 수 있습니다.
Greg von Winckel 2015 년

더 빠른 방법이 있습니까?
Vicrobot 19

1
list대괄호를 생략 하여 중간 생성을 피할 수 있습니다. 즉,tuple(tuple(row) for row in myarray)
norok2

1

긴 컷을 좋아한다면 a_m에 대한 또 다른 방법 tuple (tuple (a_m.tolist ()))

from numpy import array
a = array([[1, 2],
           [3, 4]])
tuple(tuple(a_m.tolist()) for a_m in a )

출력은 ((1, 2), (3, 4))입니다.

(a_m의 a_m에 대한 tuple (a_m.tolist ()))는 생성기 표현을 제공합니다. Greg von Winckel 의 답변에 대한 @ norok2의 의견에서 영감을 얻었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.