【发布时间】:2020-05-08 10:34:14
【问题描述】:
考虑array1 和array2,与:
array1 = [a1 a2 NaN ... an]
array2 = [[NaN b2 b3 ... bn],
[b21 NaN b23 ... b2n],
...]
两个数组都是 numpy 数组。有一种简单的方法可以计算array1和array2的每一行之间的欧几里得距离:
EuclideanDistance = np.sqrt(((array1 - array2)**2).sum(axis=1))
让这个计算变得混乱的是 NaN 值。当然,我可以轻松地将 NaN 替换为某个数字。但相反,我想做以下事情:
当我将array1 与array2 中的row_x 进行比较时,我计算了其中一个数组具有NaN 而另一个不具有NaN 的列。假设count 为3。然后我将从两个数组中删除这些列并计算两者之间的欧几里得距离。最后,我将minus_value * count 添加到计算的距离。
现在,我想不出一种快速有效的方法来做到这一点。有人可以帮助我吗?
以下是我的一些想法:
minus = 1000
dist = np.zeros(shape=(array1.shape[0])) # this array will store the distance of array1 to each row of array2
array1 = np.repeat(array1, array2.shape[0], axis=0) # now array1 has the same dimensions as array2
for i in range(0, array1.shape[0]):
boolarray = np.logical_or(np.isnan(array1[i]), np.isnan(array2[i]))
count = boolarray.sum()
deleteIdxs = boolarray.nonzero() # this should give the indices where boolarray is True
dist[i] = np.sqrt(((np.delete(array1[i], deleteIdxs, axis=0) - np.delete(array2[i], deleteIdxs, axis=0))**2).sum(axis=0))
dist[i] = dist[i] + count*minus
然而,这些线条对我来说看起来不仅丑陋。此外,我不断收到索引错误:显然 deleteIdxs 包含的索引超出了 array1 的范围。不知道这怎么可能。
【问题讨论】:
-
我不太清楚 nan 值有什么问题。为什么不计算距离(也许使用
np.linalg.norm而不是手动计算)然后简单地忽略 nans?