2017-12-28 22 views
-4

일부 np 2D 배열 (A, B, C)의 요소에 대해 일반 연산을 구현해야합니다. 의사 코드에서numpy 배열로 중첩되지 않도록하십시오

for i in A.height: 
    for j in A.width: 
     A[i,j] = f(B[i,j],C[i,j]) 
F() 다음 struct.pack()에 의해 두 변수의 비트들을 연결된다 struct.unpack()가

  x = struct.pack('2B', B[i, j], C[i, j]) 
      y = struct.unpack('H', x) 

이 코드는 정말로 긴 소요

실행 시간 (640 * 480 매트릭스의 경우 0.25 초, 어쩌면 정상이지만 아직 더 빨리 사용할 수 있습니다.) 성능을 향상시킬 수있는 동일한 결과를 얻는 비단뱀 방식을 제안 할 수 있는지 궁금합니다.

+2

'f()'에 따라 다릅니다. 쓰레드 나 멀티 프로세싱을 사용해 볼 수 있습니다. – Harvey

+3

'f'가하는 일, 데이터가 얼마나 큰지, 실제로 "실행하는데 정말로 오랜 시간이 걸리는지"에 대한 지식 없이도 누군가가 대답하기를 기대하는 방법이 실제로 확실치 않습니다. – excaza

+2

[방송] (http://scipy.github.io/old-wiki/pages/EricsBroadcastingDoc)을 이용하기 위해'f'를 수정할 수 있습니까? –

답변

0

'f'가하는 일에 달려 있습니다 ... 이것이 무슨 뜻인지 확실하지 않습니다

b = np.arange(3*4).reshape(3,4) 
c = np.arange(3*4).reshape(3,4)[::-1] 

b 
array([[ 0, 1, 2, 3], 
     [ 4, 5, 6, 7], 
     [ 8, 9, 10, 11]]) 

c 
array([[ 8, 9, 10, 11], 
     [ 4, 5, 6, 7], 
     [ 0, 1, 2, 3]]) 

def f(b, c): 
    """some function""" 
    a = b + c 
    return a 

a = f(b, c) 
a 
array([[ 8, 10, 12, 14], 
     [ 8, 10, 12, 14], 
     [ 8, 10, 12, 14]]) 
1

함수 :

In [310]: def foo(a,b): 
    ...:  x = struct.pack('2B', a,b) 
    ...:  return struct.unpack('H',x)[0] 

np.vectorize 방송 배열의 편리한 방법입니다. 함수에 스칼라 값을 전달합니다.

In [313]: np.arange(5)[:,None]+np.arange(10)*256 
Out[313]: 
array([[ 0, 256, 512, 768, 1024, 1280, 1536, 1792, 2048, 2304], 
     [ 1, 257, 513, 769, 1025, 1281, 1537, 1793, 2049, 2305], 
     [ 2, 258, 514, 770, 1026, 1282, 1538, 1794, 2050, 2306], 
     [ 3, 259, 515, 771, 1027, 1283, 1539, 1795, 2051, 2307], 
     [ 4, 260, 516, 772, 1028, 1284, 1540, 1796, 2052, 2308]]) 

: 내가 같은 배열에 간단한 수학 표현식으로 그 값을 복제 할 수 있습니다

In [311]: fv = np.vectorize(foo) 
In [312]: fv(np.arange(5)[:,None],np.arange(10)) 
Out[312]: 
array([[ 0, 256, 512, 768, 1024, 1280, 1536, 1792, 2048, 2304], 
     [ 1, 257, 513, 769, 1025, 1281, 1537, 1793, 2049, 2305], 
     [ 2, 258, 514, 770, 1026, 1282, 1538, 1794, 2050, 2306], 
     [ 3, 259, 515, 771, 1027, 1283, 1539, 1795, 2051, 2307], 
     [ 4, 260, 516, 772, 1028, 1284, 1540, 1796, 2052, 2308]]) 

(일반 반복에 비해 2 배의 속도를 제공 할 수 있습니다 frompyfunc 관련) 코드를 속도를하지 않습니다 이것은 아마도 제한된 범위의 값에서만 작동하지만 numpy에서 계산을 올바르게 '벡터화'할 수있는 방법을 제공합니다.