python - 如何在 numpy 中获取 3x3x3 数组上的欧几里德距离

标签 python matrix numpy scipy linear-algebra

假设我有一个像这样的 (3,3,3) 数组。

array([[[1, 1, 1],
        [1, 1, 1],
        [0, 0, 0]],

       [[2, 2, 2],
        [2, 2, 2],
        [2, 2, 2]],

       [[3, 3, 3],
        [3, 3, 3],
        [1, 1, 1]]])

如何获得与 3 个值的每个向量和第零个值之间的欧氏距离相对应的 9 个值?

比如执行 numpy.linalg.norm([1,1,1] - [1,1,1]) 2 次,然后执行 norm([0, 0,0] - [0,0,0]),然后 norm([2,2,2] - [1,1,1]) 2 次,norm([2,2,2] - [0,0,0]),然后 norm([3,3,3] - [1,1,1]) 2次,最后是norm([1,1,1] - [0,0,0])

有什么好的方法可以对其进行矢量化吗?我想将距离存储在 (3,3,1) 矩阵中。

结果将是:

array([[[0. ],
        [0. ],
        [0. ]],

       [[1.73],
        [1.73],
        [3.46]]

       [[3.46],
        [3.46],
        [1.73]]])

最佳答案

keepdims 参数在 numpy 1.7 中添加,您可以使用它来保留总和轴:

np.sum((x - [1, 1, 1])**2, axis=-1, keepdims=True)**0.5

结果是:

[[[ 0.        ]
  [ 0.        ]
  [ 0.        ]]

 [[ 1.73205081]
  [ 1.73205081]
  [ 1.73205081]]

 [[ 3.46410162]
  [ 3.46410162]
  [ 0.        ]]]

编辑

np.sum((x - x[0])**2, axis=-1, keepdims=True)**0.5

结果是:

array([[[ 0.        ],
        [ 0.        ],
        [ 0.        ]],

       [[ 1.73205081],
        [ 1.73205081],
        [ 3.46410162]],

       [[ 3.46410162],
        [ 3.46410162],
        [ 1.73205081]]])

关于python - 如何在 numpy 中获取 3x3x3 数组上的欧几里德距离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16474947/

相关文章:

python - 如何从一个 csv 文件读取多个矩阵?

python - 如何在 python 中使用多个索引同时填充 numpy 数组

python - 如何在 Pandas DataFrames 中显示 IntEnum 的名称

python - 网络摄像头在 opencv-python 和 opencv-contrib-python 的 pip 版本中不起作用

python - python 中的 "if var and var2 == getSomeValue()"- 如果第一个为假,是否评估第二个语句?

c++ - 位矩阵相对于位图的优势

python - 在 Django 模型中为 id 设置自动递增初始值

algorithm - 二进制 n x m 矩阵的模 c 数,每列最多 k 个连续的 1

python - 测试 numpy 数组是否仅包含零

performance - 高效计算 1xM Times MxM Times Mx1, N Times