2016-12-05 21 views
0

Xは、n行d行の行列です。Wは、すべての行のm行d行です。Xすべての行で2乗ユークリッド距離を計算したいので、結果はn×m行列。Theano行/列の減算

1行のみWにありますならば、これは簡単

x = tensor.TensorType("float64", [False, False])() 
w = tensor.TensorType("float64", [False])() 
z = tensor.sum((x-w)**2, axis=1) 
fn = theano.function([x, w], z) 
print fn([[1,2,3], [2,2,2]], [2,2,2]) 
# [ 2. 0.] 

Wは(Theanoで)行列であるとき、私は何をしますかですか?

答えて

1

短い答え、あなたはscipyのダウンロードを持っていない場合は、減算放送することで、scipy.spatial.distance.cdist

長い答えを使用して、軸によって規範0

np.linalg.norm(X[:,:,None]-W[:,None,:], axis=0)

あなたの本当に長い答え、 vecorizable linalg.normなしnumpyのの古代のバージョンを持っている(つまり、あなたはAbaqusのを使用している)

np.sum((X[:,:,None]-W[:,None,:])**2, axis=0).__pow__(0.5)

ですTheanoでOP
によって

編集我々はXW両方の3D行列を作り、

x = tensor.TensorType("float64", [False, True, False])() 
w = tensor.TensorType("float64", [True, False, False])() 

z = tensor.sum((x-w)**2, axis=2) 

fn = theano.function([x, w], z) 
print fn([[[0,1,2]], [[1,2,3]]], [[[1,1,1], [2,2,2]]]) 
# [[ 2. 5.] 
# [ 5. 2.]] 
+0

は、実際に私は[Theano](HTTPでの実装を求めていた、ありがとうございましたように、対応する軸がbroadcastableすることができます://deeplearning.net/software/theano/)、あなたは何か考えていますか? – dontloo

+0

あなたの努力のおかげで、 –

+0

あなたのおかげです。 – dontloo

0

幸いにもWの行数が事前に知ることができるので、私は時間的

x = tensor.TensorType("float64", [False, False])() 
m = 2 
w = tensor.as_tensor([[2,2,2],[1,2,3]]) 
res_list = [] 
for i in range(m): 
    res_list.append(ten.sum((x-w[i,:])**2, axis=1)) 

z = tensor.stack(res_list) 

fn = theano.function([x], z) 
print fn([[1,2,3], [2,2,2], [2,3,4]]) 

# [[ 2. 0. 5.] 
# [ 0. 2. 3.]] 

他の回答をやっては大歓迎です!