X
是一个n乘d矩阵,W
是一个m乘d矩阵,对于X
中的每一行,我想计算{{1}中每一行的欧几里德距离平方1}},所以结果将是一个n乘m矩阵。
如果W
中只有一行,这很容易
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.]
是矩阵(在Theano中)时我该怎么办?
答案 0 :(得分:1)
简短回答,请使用scipy.spatial.distance.cdist
很长的答案,如果你没有scipy,就是通过轴0广播减法然后规范。
np.linalg.norm(X[:,:,None]-W[:,None,:], axis=0)
真的很长的答案,你有一个古老版本的numpy没有可升级linalg.norm
(即你使用Abaqus)
np.sum((X[:,:,None]-W[:,None,:])**2, axis=0).__pow__(0.5)
按OP编辑
在Theano中,我们可以使X
和W
两个三维矩阵并使相应的轴可以播放,如
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.]]
答案 1 :(得分: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.]]
欢迎其他答案!