Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中缺少值的两组点之间的快速欧氏距离_Python_Numpy_Scipy - Fatal编程技术网

Python中缺少值的两组点之间的快速欧氏距离

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距离。同样的道理也适用于美国

我有两个numpy矩阵X和Y,分别代表一些d维空间中的一组点。我想计算从X中的每个点到Y中的每个点的所有欧几里德距离。为了精确地计算,但有一个缺点:一些点包含以NaN形式丢失的值。我希望距离操作忽略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那是。询问者想要什么。删除了我的评论。