Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.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 用缺少的值计算scipy中的成对距离_Python_Scipy_Distance_Nan - Fatal编程技术网

Python 用缺少的值计算scipy中的成对距离

Python 用缺少的值计算scipy中的成对距离,python,scipy,distance,nan,Python,Scipy,Distance,Nan,我对如何处理丢失的(nan)值感到有点困惑 以防我弄乱了矩阵的维数,让我们把它放一边。从文档中: 这些点在矩阵X中被安排为m个n维行向量 因此,让我们在10维空间中生成三个缺少值的点: numpy.random.seed(123456789) data = numpy.random.rand(3, 10) * 5 data[data < 1.0] = numpy.nan 我得到: array([ nan, nan, nan]) array([ 3.35518662, 2.35481

我对如何处理丢失的(
nan
)值感到有点困惑

以防我弄乱了矩阵的维数,让我们把它放一边。从文档中:

这些点在矩阵X中被安排为m个n维行向量

因此,让我们在10维空间中生成三个缺少值的点:

numpy.random.seed(123456789)
data = numpy.random.rand(3, 10) * 5
data[data < 1.0] = numpy.nan
我得到:

array([ nan, nan, nan]) array([ 3.35518662, 2.35481185, 3.10323893]) 我得到:

array([ nan, nan, nan]) array([ 3.35518662, 2.35481185, 3.10323893]) 10000个回路,最好为3个:每个回路98.9µs
因此,我认为前进的方向是在函数中对上述代码进行循环化。

如果我理解正确,您需要两个向量具有有效值的所有维度的距离

%timeit pdist(data, "euclidean")
不幸的是,
pdist
不理解这种意义上的屏蔽数组,所以我修改了您的半解决方案,以不减少信息。但是,它不是最有效的解决方案,也不是最可读的:

np.array([pdist(data[s][:, ~numpy.isnan(data[s]).any(axis=0)], "euclidean") for s in map(list, itertools.combinations(range(data.shape[0]), 2))]).ravel()
把它做成一个数组和
ravel
只是为了让它的形状与你所期望的相匹配

itertools.compositions
生成
数据的所有可能的成对索引


然后,我只需对这些数据进行切片(必须是
列表
而不是
元组
,才能正确切片),然后像代码一样对
nan
进行成对过滤。

实际上,您最好使用这个现成的解决方案:


然而,缺点似乎是当缺少值时,应用权重更为棘手

谢谢您的回答。请看我上面编辑过的问题。如果你把它简单化,那么直接围绕屏蔽阵列构建它可能不会更好看?另外,在将小样本的性能扩展到大样本时也要小心……很抱歉我迄今为止最糟糕的语法评论。在100维空间中运行1000个点仍然使python解决方案更快(2.65倍)。@deinonychusaur“直接围绕屏蔽阵列构建”是什么意思?如果要隐藏数据,仍然需要使用提供给
ma.array
的掩码,对吗?也许你可以编辑你的答案或者我们聊聊天。确实如此,但是python代码看起来会更整洁。我也到处找,不知道这是否有帮助。可以聊天,但不知道我是否还有更多可以提供的。@午夜时分,您的代码有没有进一步的加速?这确实是一个很好的解决方案,但它只是在2019年12月添加的,而问题到现在已经有几年了。我会接受你的回答,因为这是我今天要使用的函数。
%timeit numpy.array([pdist(data[s][:, ~numpy.isnan(data[s]).any(axis=0)], "euclidean") for s in map(list, itertools.combinations(range(data.shape[0]), 2))]).ravel()
1000 loops, best of 3: 231 µs per loop
from scipy.linalg import norm

%%timeit
m = data.shape[0]
dm = numpy.zeros(m * (m - 1) // 2, dtype=float)
mask = numpy.isfinite(data)
k = 0
for i in range(m - 1):
    for j in range(i + 1, m):
        curr = numpy.logical_and(mask[i], mask[j])
        u = data[i][curr]
        v = data[j][curr]
        dm[k] = norm(u - v)
        k += 1
10000 loops, best of 3: 98.9 µs per loop
np.array([pdist(data[s][:, ~numpy.isnan(data[s]).any(axis=0)], "euclidean") for s in map(list, itertools.combinations(range(data.shape[0]), 2))]).ravel()