如何将函数应用于矩阵中的所有向量对

时间:2017-02-01 11:24:42

标签: numpy vectorization

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

对于矩阵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的矩阵吗?

1 个答案:

答案 0 :(得分:3)

使用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