Python 行的最快成对差

Python 行的最快成对差,python,numpy,Python,Numpy,我有一个n×3的numpy数组,每一行代表三维空间中的一个向量 我想要一个三维n×n×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 ar

我有一个n×3的numpy数组,每一行代表三维空间中的一个向量

我想要一个三维n×n×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
…)


有什么聪明的矩阵数学方法可以更有效地完成我想要的任务吗?

与一年多前的情况类似。
n
的典型值是什么?我不明白为什么这会特别慢,除了这样一个事实:NX3阵列的结果可能很大,并且会扩展机器的内存容量。它必须执行n*n*3减法运算,但它应该在C代码中执行这些运算。@WarrenWeckesser在我的用例中,一个典型的n大约是500。@hpaulj也许它不是绝对慢,但与我正在做的其他事情相比,它相对慢。也许我只是反应过度了……与一年多前的情况类似。
n
的典型值是多少?我不明白为什么这会特别慢,除了这样一个事实:ing NX3阵列可能会很大,并且会扩展机器的内存容量。它必须执行n*n*3减法运算,但它应该在C代码中执行这些运算。@WarrenWeckesser在我的用例中,一个典型的n大约是500。@hpaulj也许它不是绝对慢,但与我正在做的其他事情相比,它相对慢。也许我只是反应过度了。。。