我有一个n乘3的numpy数组,每行代表一个3D空间中的向量。
我想要一个3D n乘3乘3的数组,其中[i,j]处的向量表示向量i和j的每个分量之间的差异。
>>> x = np.random.randint(10, size=(4, 3))
>>> x
array([[4, 0, 8],
[8, 5, 3],
[4, 1, 6],
[2, 2, 4]])
>>> x[:, np.newaxis] - x
array([[[ 0, 0, 0],
[-4, -5, 5],
[ 0, -1, 2],
[ 2, -2, 4]],
[[ 4, 5, -5],
[ 0, 0, 0],
[ 4, 4, -3],
[ 6, 3, -1]],
[[ 0, 1, -2],
[-4, -4, 3],
[ 0, 0, 0],
[ 2, -1, 2]],
[[-2, 2, -4],
[-6, -3, 1],
[-2, 1, -2],
[ 0, 0, 0]]])
这是有效的,但是到目前为止我的程序中最慢的行...比我的欧几里德距离代码(利用点积和einsum
更慢......)
是否有任何聪明的矩阵数学方法可以更有效地完成我想要的工作?