我想计算行向量相对于矩阵中所有其他行向量的距离之和。因此,结果必须是方阵。
对于矩阵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的矩阵吗?
答案 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