【问题标题】:Vectorize numpy code [duplicate]矢量化numpy代码[重复]
【发布时间】: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


【解决方案1】:

您可以将其矢量化为:

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 计算。


示例

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-17
    • 2017-07-25
    • 1970-01-01
    • 1970-01-01
    • 2018-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多