2017-12-28 8 views
-4

いくつかのnp 2次元配列(A、B、C)の要素に対して一般的な操作を実装する必要があります。 F()はこのコードは実際に長くかかりnumpy配列でネストされないようにする

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

struct.unpack())(struct.packによって二つの変数のビットを連結された擬似コードで

for i in A.height: 
    for j in A.width: 
     A[i,j] = f(B[i,j],C[i,j]) 

実行時間(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で計算を適切に 'ベクトル化'する方法が考えられます。

関連する問題