2013-04-26 5 views
0

나는 (16000000,5) numpy 배열이 있고 각 행에이 함수를 적용하려고합니다.numpy 배열의 모든 행에 함수 적용

def f(row): 
#returns a row of the same length. 
    return [row[0]+0.5*row[1],row[2]+0.5*row[3],row[3]-0.5*row[2],row[4]-0.5*row[3],row[4]+1] 

벡터화가 느리게 작동합니다.

나는이

np.column_stack((arr[:,0]+0.5*arr[:,1],arr[:,2]+0.5*arr[:,3],arr[:,3]-0.5*arr[:,2],arr[:,4]-0.5*arr[:,3],arr[:,4]+1)) 

처럼가는 시도하지만 메모리 오류가 발생합니다.

가장 빠른 방법은 무엇입니까?

답변

2

당신은 사전에 할당하고 분할 별도의 라인으로 작업을 더 낫다, 당신은 column_stack를 사용하여 가독성이나 속도면에서 여기 아무것도 얻을 수 없습니다.

result = np.zeros_like(arr) 
result[:, 0] = arr[:, 0] + .5 * arr[:, 1] 
result[:, 1] = arr[:, 2] + .5 * arr[:, 3] 
result[:, 2] = arr[:, 3] - .5 * arr[:, 2] 
result[:, 3] = arr[:, 4] - .5 * arr[:, 3] 
result[:, 4] = arr[:, 4] + 1 
2
In [104]: arr=np.random.rand(1000000,5) 
In [105]: %timeit a=np.column_stack((arr[:,0]+0.5*arr[:,1],arr[:,2]+0.5*arr[:,3],arr[:,3]-0.5*arr[:,2],arr[:,4]-0.5*arr[:,3],arr[:,4]+1)) 
10 loops, best of 3: 86.3 ms per loop 

In [106]: %timeit a2=map(f,arr)1 loops, best of 3: 10.2 s per loop 


In [98]: a2=map(f,arr) 

In [99]: %timeit a2=map(f,arr) 
100 loops, best of 3: 10.5 ms per loop 

In [100]: np.all(a==a2) 
Out[100]: True 
+0

16000000 행이 처리됩니까? – amine23

+0

장점은 'c' 루프입니다. – Moj

+0

큰 코드를 위해 코드를 업데이트했습니다. – Moj

관련 문제