所以我试图在numpy中渲染这段代码并且我遇到了麻烦 Heres是我的for循环版本,可以按照需要运行:
B是3x3矩阵
for i in range(b.shape[0]):
for j in range(b.shape[0]):
Z[i,j] = np.sqrt(np.dot((b[i,:].T - b[j,:].T).T , b[i,:].T - b[j,:].T))
现在我正在尝试对此代码进行矢量化,因此我不必使用双循环。到目前为止我得到的东西不起作用:
i = 0, j = 0
np.sqrt( np.dot ( (p[i,:].T - p[j:,:].T).T , p[i,:].T - p[j,:].T ))
理想情况下,如果你分解为for循环会做什么,它应该执行此操作。
np.sqrt( np.dot ( (p[0,:].T - p[0,:].T).T , p[0,:].T - p[0,:].T ))
np.sqrt( np.dot ( (p[0,:].T - p[1,:].T).T , p[0,:].T - p[1,:].T ))
np.sqrt( np.dot ( (p[1,:].T - p[0,:].T).T , p[1,:].T - p[0,:].T ))
np.sqrt( np.dot ( (p[1,:].T - p[1,:].T).T , p[1,:].T - p[1,:].T ))
有人可以提供一些见解。我宁愿不使用任何内置函数,并坚持使用像np.dot这样的东西。这是计算Eucledean距离矩阵。
答案 0 :(得分:3)
您可以将其矢量化为:
b = np.asarray(b) # in case you have a matrix, convert it to an array
np.linalg.norm(b - b[:,None], axis=2)
b - b[:,None]
执行b
的行外减法,np.sqrt(np.dot(...,...))
可以使用np.linalg.norm
计算。{/ p>
实施例:
a = np.arange(9).reshape(3,3)
b = np.matrix(a)
Z = np.zeros_like(b, dtype=np.float32)
for i in range(b.shape[0]):
for j in range(b.shape[0]):
Z[i,j] = np.sqrt(np.dot((b[i,:].T - b[j,:].T).T , b[i,:].T - b[j,:].T))
Z
#array([[ 0. , 5.19615221, 10.39230442],
# [ 5.19615221, 0. , 5.19615221],
# [ 10.39230442, 5.19615221, 0. ]], dtype=float32)
b = np.asarray(b)
np.linalg.norm(b - b[:,None], axis=2)
#array([[ 0. , 5.19615242, 10.39230485],
# [ 5.19615242, 0. , 5.19615242],
# [ 10.39230485, 5.19615242, 0. ]])