2014-06-24 2 views
3

나는 numpy 배열을 가지고있다. 축을 따라 연속하는 2 차원 슬라이스에 함수를 실행하고 결과로 생성 된 슬라이스를 함께 쌓아서 새 3D 배열을 형성하고 싶습니다. 분명히 이것을 할 수있는 많은 방법이 있습니다. 나는 가능한 가장 간결한 방법으로 그것을하고 싶습니다. 나는 이것이 numpy.vectorize으로 가능할 것이라고 생각하지만, 이것은 첫 번째 축을 따라 움직이는 2D 슬라이스가 아니라 내 배열의 모든 값을 반복하는 함수를 생성하는 것으로 보인다.연속적인 2 차원 슬라이스를 통한 넘치는 벡터화 함수

new3dmat = np.vectorize(func2dmat)(my3dmat) 

그리고이 같은 일이 수행 :

new3dmat = np.empty_like(my3dmat) 
for i in range(my3dmat.shape[0]): 
    new3dmat[i] = func2dmat(my3dmat[i]) 

가 어떻게 이러한 목표를 달성 할 수

기본적으로, 내가 이렇게 보이는 코드를 원하는?

+0

'func2dmat'을 전체 3D 배열에서 작동하도록 다시 쓸 수 없습니까? YMMV이지만, 일반적으로 tHat는 이러한 유형의 벡터화를 수행하는 가장 좋은 방법입니다. – Jaime

+0

그럴 수 있지만 루프 솔루션이 더 좋습니다. 나는 그 구성 요소 (2 차원 행렬)에서 작동하는 함수로 복합 데이터 구조 (3 차원 행렬)를 간결하게 조작 할 수 있기를 원합니다.이 함수는 그 구성 요소가 오는 더 큰 구조에 대한 지식을 필요로하지 않아야합니다. 그런 식으로는 하나의 함수 만 필요합니다. 2 차원 행렬을 포함하는 모든 가능한 구조에 특별한 함수가 필요하지 않습니다. –

+0

예를 들어 GUFUNC를 원합니다. ['np.linalg.det'] (http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.det.html) ... 관례는 모든 2D에 기능을 작동시키는 것입니다 입력의 마지막 2 차원에 배열. 이를 위해 빠른 벡터화 된 코드를 작성할 수 있다면 다른 축을 처리하도록하는 것이 현명합니다. ['np.rollaxis'] (http://docs.scipy.org/doc/numpy/reference/generated/) numpy.rollaxis.html) 등이있다. numpy를 최대한 활용하려면 Python 루프 솔루션을 사용하는 것이 좋습니다. – Jaime

답변

3

아래와 같은 내용이 간결성과 성능 간의 최상의 절충안입니다. apply_along_axis는 불행히도 여러 축을 사용하지 않습니다.

new3dmat = np.array([func2dmat(slice) for slice in my3dmat]) 

이 추가 할당 측면에서 좋지 않은 등 있지만 [0] .shape이 크기는 빅 상대가 아닌 경우, 추가적인 오버 헤드는 최소화되어야한다.

+0

음, 괜찮아 보입니다. 궁금한데,'slice in my3dmat'을 첫 번째 축과 다른 축을 따라 반복하는 방법이 있습니까? –

+0

np.rollaxis를 사용하여 원하는 축을 앞으로 가져 와서 반복 할 수 있습니다. –

관련 문제