2016-07-19 17 views
1

2つの配列x.dim = (N,4)y.dim = (M, M, 2)と関数を引数としてそれぞれKLという引数をとります。私は配列を取得したいres.dim = (N, M, M)3つのネストループをベクトル化する - NumPy

for n in range(N): 
    for i in range(M): 
    for j in range(M): 
     res[n, i, j] = f(x[n], y[i, j]) 

が、この場合にapplyを使用する方法を取得できませんように。事前におかげで助けてください!ここで

def f(a, b): 
    return max(0, 1 - np.sum(np.square(np.divide(np.subtract(b, a[0:2]), a[2:4])))) 
+0

これは私が '、'、レンジ(N)でjは動作しないことができますか? intオブジェクトは反復可能ではありませんか?範囲(N)が0からN-1までのintのリストであると仮定すると、 –

+0

それであなたはそれを実際にどのように書くのですか? –

答えて

1

NumPy broadcastingとスライシングを使用して記載されている機能で動作するようにベクトル化されたアプローチだ -

# Slice out relevant cols from x 
x_slice1 = x[:,None,None,:2] 
x_slice2 = x[:,None,None,2:4] 

# Perform operations using those slices to correspond to iterative operations 
out = np.maximum(0,1-(np.divide(y-x_slice1,x_slice2)**2).sum(3)) 
関連する問題