矢量化numpy代码

时间:2017-10-04 00:35:06

标签: python numpy vectorization

所以我试图在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距离矩阵。

1 个答案:

答案 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.        ]])