2010-05-05 9 views
5

NxM numpy 배열을 인수로 취하여 스칼라 값을 반환하는 함수 foo이 있습니다. 나는이 일을하고있어,2D numpy 배열의 매핑 함수

Curently 나에게 길이 A의 결과 NumPy와 배열을 제공하기 위해 나는 foo을지도하고 싶은 통해 AxNxM의 NumPy와 배열 data을 가지고 :

그것은 작동
result = numpy.array([foo(x) for x in data]) 

, 그러나 나는 numpy 마술 (그리고 속도)을 이용하지 않고있는 것처럼 보인다. 더 좋은 방법이 있습니까?

나는 numpy.vectorizenumpy.apply_along_axis을 보았지만 어느 것도 2 차원 어레이의 기능에 대해 작동하지 않습니다.

편집 : 24x24 이미지 패치에서 후진 회귀를 수행 중이므로 내 AxNxM은 1000x24x24와 비슷합니다. 위의 foo은 패치에 Haar와 유사한 기능을 적용합니다 (너무 심하게 계산하지 않아도 됨).

+1

의 계산을 적용, 그것은 임의의 차원의 NumPy와 배열을 받아 들일 수 있도록'foo'을 코딩하는 방법이있을 수 있습니다 마지막 두 축으로 그러나 우리는'foo'가 어떻게 구체적인 제안을하기 위해 코딩되었는지를 알아야합니다. – unutbu

+0

내 특정 문제에 대한 세부 정보를 추가했습니다. 'data'를 그대로두고,'foo'를 다시 호출하여 인덱스 매개 변수를 취한 다음 벡터화하고'arange (len (x)) '에 매핑 할 수 있습니까? – perimosocordiae

답변

3

NxM이 큰 경우 (예 : 100), A를 반복하는 비용은 기본적으로 아무 것도 상각되지 않습니다.

어레이 1000 X 100 X 100

순회가 O (1000)이다 말하지만, 내부 기능의 누적 비용 O (1000 X 100 X 100)의 - 10,000 배 느리다. (내 용어가 조금 남았습니다입니다, 참고,하지만 난 내가 무슨 말을하는지 알아 않습니다) 잘 모르겠어요

을하지만이 시도 할 수 :

result = numpy.empty(data.shape[0]) 
for i in range(len(data)): 
    result[i] = foo(data[i]) 

당신은 큰을 절약 할 수 목록을 작성하는 데 메모리 할당 ...하지만 루프 오버 헤드가 더 커집니다.

또는 루프의 병렬 버전을 작성하여 여러 프로세스로 분할 할 수 있습니다. foo의 집중력에 따라 (데이터 처리를 상쇄해야하므로) 훨씬 빨라질 수 있습니다.

+4

변형 :'result = np.fromiter (itertools.imap (f, 데이터), dtype = 데이터 형식, 개수 = 데이터 형식 [0]) ' – jfs

1

3D 배열을 동일한 치수로 2D 배열로 재구성하여 함수 foofoo에 따라 필요에 따라 모양을 바꿔 1D 배열에서 작동하는 함수로 래핑 할 수 있습니다. 예 (trace 대신 foo의 사용) :

from numpy import * 

def apply2d_along_first(func2d, arr3d): 
    a, n, m = arr3d.shape 
    def func1d(arr1d): 
     return func2d(arr1d.reshape((n,m))) 
    arr2d = arr3d.reshape((a,n*m)) 
    return apply_along_axis(func1d, -1, arr2d) 

A, N, M = 3, 4, 5 
data = arange(A*N*M).reshape((A,N,M)) 

print data 
print apply2d_along_first(trace, data) 

출력 :

[[[ 0 1 2 3 4] 
    [ 5 6 7 8 9] 
    [10 11 12 13 14] 
    [15 16 17 18 19]] 

[[20 21 22 23 24] 
    [25 26 27 28 29] 
    [30 31 32 33 34] 
    [35 36 37 38 39]] 

[[40 41 42 43 44] 
    [45 46 47 48 49] 
    [50 51 52 53 54] 
    [55 56 57 58 59]]] 
[ 36 116 196] 
+1

'np.fromiter (imap 'apply2d _...()'보다 빠릅니다. – jfs