【问题标题】:Vectorized spatial distance between values in multidimensional arrays多维数组中值之间的向量化空间距离
【发布时间】:2018-09-11 23:31:36
【问题描述】:

给定一个 (2,2,3,3,3) 沿最后一维的 3D 笛卡尔坐标数组,使用 scipy.spatial.distance.cdist 计算 XA 和 XB 中的成对值之间的欧几里得的语法是什么,以产生形状为 (2, 3, 3) 的输出数组?

XA = np.random.normal(size=(2,2,3,3,3))
XB = np.random.normal(size=(2,2,3,3,3))
dist = cdist(XA[:, 0, ...], XB[:, 1, ...], 'seuclidean')

返回ValueError: XA must be a 2-dimensional array。因此,除了循环之外,计算cdist(XA[:, 0], XB[:, 1]) 的pythonic 语法是什么?

【问题讨论】:

  • 如果坐标在最后一个轴上,如何得到 (2,3,3) 的输出形状?
  • @DSM 我不确定这是否是我自己的误解所在,但XA[:, 0]XB[:, 1] 都有(2,3,3,3) 的形状,并且考虑到沿最后一个轴的距离计算,我希望得到结果数组形状(2,3,3).
  • 啊,我想我明白我的困惑了——我认为 cdist 计算的距离可能比你关心的要多。它会计算所有的交叉距离,所以基本上是 num_XA_points * num_XB_points。但是您只想要 num_XA = num_XB 成对距离,对吗?
  • 天啊!是的,我只想要 num_XA = num_XB 成对距离。所以我可能需要在这里使用pdist,是吗?
  • 你能提供一个(简化的?)输入/输出示例吗?

标签: scipy scipy-spatial


【解决方案1】:

这是在做这项工作吗?如果只需要成对距离,并且坐标在最后一维上:

import numpy as np

XA = np.random.normal(size=(2,2,3,3,3))
XB = np.random.normal(size=(2,2,3,3,3))

distances = np.sqrt(np.sum((XA - XB)**2, axis=-1))

但这里distances.shape(2, 2, 3, 3)...

【讨论】:

  • 是的,这行得通。我完全被np.cdistnp.pdist 迷惑了。只需要基本的操作模块。一位同事也给了我一个等效的解决方案...np.linalg.norm(XA - XB, axis=-1)
猜你喜欢
  • 2020-09-03
  • 1970-01-01
  • 2021-06-06
  • 2013-10-03
  • 2018-08-07
  • 2011-07-28
  • 2017-05-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多