【发布时间】:2018-03-15 06:53:45
【问题描述】:
所以我试图在 numpy 中对这段代码进行矢量化,但我遇到了麻烦 这是我的 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))
现在我正在尝试对这段代码进行矢量化处理,这样我就不必使用双 for 循环了。到目前为止,我得到的东西不起作用:
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 之类的东西。顺便说一句,这是计算欧几里得距离矩阵。
【问题讨论】:
-
对于初学者,您可以简化为
Z[i,j] = np.linalg.norm(b[:,i]-b[:,j]) -
了解代码的作用会有所帮助。
标签: python numpy vectorization