2016-05-05 4 views
1

ABの2つの配列がそれぞれ(n1,m1,m2)(n2,m1,m2)であるとします。行列Cの数値を(n1,n2)と計算して、C[i,j] = sum((A[i,:,:] - B[j,:,:])^2)としたいと思います。ここで私はこれまで持っているものです。numpy - 第1軸に沿った2つの配列間の「要素ごとの」差を計算する

import numpy as np 
A = np.array(range(1,13)).reshape(3,2,2) 
B = np.array(range(1,9)).reshape(2,2,2) 
C = np.zeros(shape=(A.shape[0], B.shape[0])) 
for i in range(A.shape[0]): 
    for j in range(B.shape[0]): 
     C[i,j] = np.sum(np.square(A[i,:,:] - B[j,:,:])) 
C 

これを行うための最も効率的な方法は何ですか? Rでは、outerなどのベクトル化アプローチを使用します。 Pythonにも同様のメソッドがありますか?

ありがとうございました。

答えて

3

あなたがそうのように、2Dreshaping入力配列の後に、このような計算のためにかなり効率的であるscipy's cdistを、使用することができます - 作業するとき

from scipy.spatial.distance import cdist 

C = cdist(A.reshape(A.shape[0],-1),B.reshape(B.shape[0],-1),'sqeuclidean') 

、上記のアプローチは、効率的なメモリので、より良いものでなければなりません大きなデータで。小さな入力配列の場合は、np.einsumを使用してNumPy broadcastingを利用することもできます。

関連する問題