3

2 차원 배열의 각 요소를 반복하는 더 빠른 방법을 묻는 질문을 많이 보았지만 3 차원 배열을 반복하는 좋은 방법을 찾지 못했습니다. 각 2 차원 배열에 함수를 적용하기 위해서. 예를 들어 : 여기서파이썬에서 3d 배열에 포함 된 2 차원 배열을 반복 함

from scipy.fftpack import dct 
X = np.arange(10000, dtype=np.float32).reshape(-1,4,4) 
np.array(map(dct, X)) 

I (625,4,4) 치수의 3 차원 어레이에 포함 된 각각의 2 차원 배열을 가는데, 각 배열에 4X4를 DCT (이산 코사인 변환)를 적용. 이 작업을 수행하는 데 더 적합한 방법이 있는지 궁금합니다.

감사

답변

5

NumPy와 기능 : dct 글쎄,이 경우

, 그것은 특정 축에 그것을 적용하는 내장 기능을 가지고하는 numpy 기능입니다. 거의 모든 numpy 함수는 전체 배열에서 작동하거나 특정 축 (행 또는 열)에서 작동하도록 지시받을 수 있습니다.

그러니 그냥 dct 함수에 대한 axis 매개 변수를 활용하여 :

dct(X, axis=2) 

당신이 동등한 결과를 얻을 것이다 :

>>> (dct(X, axis=2) == np.array(map(dct, X))).all() 
True 

도> 35 배 빠른 속도의 map 기능을 사용하는 것보다 우리의 예 : (625,4,4) 행렬 :

%timeit dct(X, axis=2) 
1000 loops, best of 3: 157 µs per loop 

%timeit np.array(map(dct, X)) 
100 loops, best of 3: 5.76 ms per loop  

일반 파이썬 기능 : 하나 np.vectorize 또는 np.frompyfunc 기능을 사용하여 다른 경우

, 당신이 할 수있는 vectorize 파이썬 기능.

def foo(x): # gives an error if passed in an array 
    return x**2 

>>> X = np.arange(8, dtype=np.float32).reshape(-1,2,2) 
>>> foo_arr = np.vectorize(foo) 
>>> foo_arr(X) 
array([[[ 0., 1.], 
     [ 4., 9.]], 

     [[ 16., 25.], 
     [ 36., 49.]]]) 

토론 here는 또한 당신을 위해 도움이 될 수 있습니다 : 예를 들어 당신은 스칼라 연산을 수행하는 데모 기능이있는 경우. 그들이 말했듯이, 당신의 non-numpy 함수를 벡터 라이 제이션하는 것은 실제로 더 빠르게 만들지 않습니다.

+2

감사합니다. 나는 dct의 축 매개 변수가이 상황에서 사용될 수 있다는 것을 알지 못했다. 일반적인 해결책과 관련하여, np.vectorize에 대한 대안에 대해 궁금한 점은 답변의 마지막 부분에서 설명한 것입니다. –

+0

도움이 되니 기쁩니다. –

관련 문제