Python中缺少值的两组点之间的快速欧氏距离
我有两个numpy矩阵X和Y,分别代表一些d维空间中的一组点。我想计算从X中的每个点到Y中的每个点的所有欧几里德距离。为了精确地计算,但有一个缺点:一些点包含以NaN形式丢失的值。我希望距离操作忽略NaN条目,例如,如果我正在计算以下两点之间的距离Python中缺少值的两组点之间的快速欧氏距离,python,numpy,scipy,Python,Numpy,Scipy,我有两个numpy矩阵X和Y,分别代表一些d维空间中的一组点。我想计算从X中的每个点到Y中的每个点的所有欧几里德距离。为了精确地计算,但有一个缺点:一些点包含以NaN形式丢失的值。我希望距离操作忽略NaN条目,例如,如果我正在计算以下两点之间的距离 a = [1, 3, nan] b = [2, nan, 4] 然后我将忽略第二和第三维度,从而得到距离sqrt((1-2)**2)=1 不幸的是,在该设置中,只要在一对点中找到一个NaN,cdist就会返回一个NaN距离。同样的道理也适用于美国
a = [1, 3, nan]
b = [2, nan, 4]
然后我将忽略第二和第三维度,从而得到距离sqrt((1-2)**2)=1
不幸的是,在该设置中,只要在一对点中找到一个NaN,cdist就会返回一个NaN距离。同样的道理也适用于美国
当然,我们可以编写一个双循环来执行所有必需的操作,但是由于X和Y是大矩阵,因此速度太慢了。因此,基于numpy/scipy的解决方案是理想的
numpy确实包含一些机制,例如允许忽略NaN值执行操作,但scipy似乎忽略了这些掩码
执行此操作的有效方法是什么?最简单的方法是使用标准的欧几里德距离公式,但用
我怀疑你会得到比这更简单的东西(你必须自己计算广播,因为你只提供1d输入)。标准实践是,总是通过计算来进行
nan
。最简单的方法是使用标准的欧几里德距离公式,但将和
替换为
我怀疑你会得到比这更简单的东西(你必须自己计算广播,因为你只提供1d输入)。标准做法是,
nan
始终进行计算。根据@Daniel F的建议,您可以这样使用cdist:
cdist(XA, XB, lambda u, v: np.sqrt(np.nansum((u-v)**2)))
例如:
import numpy as np
from scipy.spatial.distance import cdist, squareform
a = np.array([1, 3, np.nan])
b = np.array([2, np.nan, 4])
print(np.sqrt(np.nansum((a-b)**2)))
输出:
1.0
上面的示例只是为了演示lambda函数的效果。使用@Daniel F的建议,您可以像这样使用cdist:
cdist(XA, XB, lambda u, v: np.sqrt(np.nansum((u-v)**2)))
例如:
import numpy as np
from scipy.spatial.distance import cdist, squareform
a = np.array([1, 3, np.nan])
b = np.array([2, np.nan, 4])
print(np.sqrt(np.nansum((a-b)**2)))
输出:
1.0
上面的示例只是演示lambda函数的效果。添加示例数据?您希望它如何“忽略”nan数据?只是不包括那个维度(eeek)?用什么来代替它?预测它?它确实取决于
nan
的数量和矩阵的大小。距离矩阵在numpy中的计算效率大致与cdist相同。如果你大部分都是“代码>n<代码”,那么你可以考虑稀疏矩阵。刚刚添加了一个示例来说明这一点。我知道这打破了整个“欧几里德距离”的概念,但它解决了我的问题,因为我需要找到几乎等于所有已知值的点。@user2653663我想说25%左右的nan在我的数据中很常见。我没有考虑稀疏矩阵,下一步将尝试。添加示例数据?您希望它如何“忽略”nan
数据?只是不包括那个维度(eeek)?用什么来代替它?预测它?它确实取决于nan
的数量和矩阵的大小。距离矩阵在numpy中的计算效率大致与cdist相同。如果你大部分都是“代码>n<代码”,那么你可以考虑稀疏矩阵。刚刚添加了一个示例来说明这一点。我知道这打破了整个“欧几里德距离”的概念,但它解决了我的问题,因为我需要找到几乎等于所有已知值的点。@user2653663我想说25%左右的nan在我的数据中很常见。我没有考虑过稀疏矩阵,下一步我会试试。我不知道你可以提供一个lambda函数作为到cdist的距离。美好的我将接受这个答案,因为它还包括广播部分,这对我来说并不简单。我不知道您可以提供lambda函数作为到cdist的距离。美好的我将接受这个答案,因为它还包括广播部分,这对我来说并不简单。@Ethat那是。询问者想要什么。删除了我的评论。@Ethat那是。询问者想要什么。删除了我的评论。