【问题标题】:How to apply a function to all vector pairs in a matrix如何将函数应用于矩阵中的所有向量对
【发布时间】:2017-02-01 11:24:41
【问题描述】:

我想计算一个行向量相对于矩阵中所有其他行向量的距离总和。因此结果必须是方阵。

对于矩阵M

    | a b c |   | v1 |
M = |       | = |    |
    | c d e |   | v2 |

我想计算:

    | (a-a)+(b-b)+(c-c)  (a-c)+(b-d)+(c-e) |   | v1-v1  v1-v2 |
M = |                                      | = |              |
    | (c-a)+(d-b)+(e-c)  (c-c)+(d-d)+(e-e) |   | v2-v1  v2-v2 |

我知道我可以在嵌套的for 循环中执行此操作,但是是否有更优雅的方法可以将此或任何其他类似操作应用于具有 numpy 的矩阵?

【问题讨论】:

    标签: numpy vectorization


    【解决方案1】:

    使用broadcasting -

    (M[:,None,:]- M).sum(2)
    

    示例运行 -

    In [41]: M
    Out[41]: 
    array([[8, 3, 2],
           [6, 1, 2]])
    
    In [42]: (M[:,None,:]- M).sum(2)
    Out[42]: 
    array([[ 0,  4],
           [-4,  0]])
    

    如果M 是一个 NumPy 矩阵,则使用 np.asarray() 获取一个数组视图,然后使用它,就像这样 -

    M_arr = np.asarray(M)
    out = np.asmatrix((M_arr[:,None,:]- M_arr).sum(2))
    

    示例运行 -

    In [69]: M = np.asmatrix(np.random.randint(0,9,(2,3)))
    
    In [70]: M
    Out[70]: 
    matrix([[3, 8, 8],
            [0, 5, 0]])
    
    In [71]: M_arr = np.asarray(M)
    
    In [72]: np.asmatrix((M_arr[:,None,:]- M_arr).sum(2))
    Out[72]: 
    matrix([[  0,  14],
            [-14,   0]])
    

    让我们也验证一下我们是否确实在使用np.asarray() 那里的视图 -

    In [73]: np.may_share_memory(M, M_arr)
    Out[73]: True
    

    【讨论】:

    • 感谢这个例子! :)
    猜你喜欢
    • 2015-04-23
    • 2017-11-07
    • 1970-01-01
    • 2013-11-11
    • 2021-09-13
    • 1970-01-01
    • 2019-09-02
    • 2019-04-20
    • 1970-01-01
    相关资源
    最近更新 更多