2016-04-12 98 views
2

给定的样本掩盖阵列和在KDTree查询,KDTree蒙面阵列

In [6]: data = np.arange(9).reshape((3,3))*1.0 

In [7]: madata = np.ma.array(data) 

In [9]: madata[1,1] = ma.masked 

In [10]: madata 
Out[10]: 
masked_array(data = 
[[0.0 1.0 2.0] 
[3.0 -- 5.0] 
[6.0 7.0 8.0]], 
     mask = 
[[False False False] 
[False True False] 
[False False False]], 
    fill_value = 1e+20) 

In [11]: from scipy.spatial import KDTree 

In [12]: matree = KDTree(madata) 

In [13]: matree.query([3,0,5]) 
Out[13]: (4.0, 1) 

这是有效使用非屏蔽数组查询树?或者应该使用一个蒙面数组,因为该树是使用蒙版数组构造的。

另一个问题是,这是一种合理的方法来找到最相似的数据对,类似于找到最相似的字符串还有数值吗?我的原始数据集大约是50k的20,其中包含许多缺失的值。因此需要使用掩码阵列和快速实现。

谢谢。

回答

2

不要指望KDTree做掩码的任何特殊处理。我的猜测是,它使用底层数据数组。

掩码数组有一个data属性和mask属性。功能和方法都注重两者。但是对于许多任务他们的数据fill具有合适的值,然后执行常规的numpy操作。例如,如果总结行或列,它将用0代替被屏蔽的元素;如果拿一个产品,用1s。

研究KDTree文档。如果他们说了一些关于使用屏蔽阵列的信息,请按照这些说明操作。但是如果你没有找到任何东西,它可能会忽略掩码。


看那KDTree代码。这是init打头:

def __init__(self, data, leafsize=10): 
    self.data = np.asarray(data) 
    .... 

np.asarray(madata)。结果是底层的data;不再是一个蒙面阵列。所以遮掩阵列没有任何区别。


见时的数据是一个楠会发生什么:

In [256]: tree.data 
Out[256]: 
array([[ 0., 1., 2.], 
     [ 3., nan, 5.], 
     [ 6., 7., 8.]]) 

In [257]: tree.query([3,4,5]) 
C:\Users\paul\AppData\Local\Enthought\Canopy\User\lib\site-packages\scipy\spatial\kdtree.py:314: RuntimeWarning: invalid value encountered in maximum 
    side_distances = np.maximum(0,np.maximum(x-self.maxes,self.mins-x)) 
Out[257]: (5.196152422706632, 0) 

的默认设置是显示这样它是在一个会话(或上下文)遇到的第一次警告。

In [265]: np.maximum([1,2,0,np.nan],[3,2,0,0]) 
-c:1: RuntimeWarning: invalid value encountered in maximum 
Out[265]: array([ 3., 2., 0., nan]) 

In [266]: np.maximum([1,2,0,np.nan],[3,2,0,0]) 
Out[266]: array([ 3., 2., 0., nan]) 

欢迎您学习KDTree代码,但它看起来像它只是让正常numpy处理发生的NaN。它没有什么特别的。

你可以省略NaN点吗?

蒙面阵列压缩可能不是你想要的,因为它返回数组的平铺版本:

In [268]: madata.compressed() 
Out[268]: array([ 0., 1., 2., 3., 5., 6., 7., 8.]) 

或用一些有用的东西填?

In [271]: madata.filled(999) 
Out[271]: 
array([[ 0., 1., 2.], 
     [ 3., 999., 5.], 
     [ 6., 7., 8.]]) 
+0

感谢您的解释。如果数据中有NAN,那该怎么办? KDTree能否正确处理这些情况? NAN是我打算使用蒙版数组的主要原因。 –

+1

查看我对nans的编辑。 – hpaulj

+0

所以构造树没有问题,但是当数据中存在NaN时查询似乎没有意义。这是主要问题。如果我用其他数字填充数据,这是不是会偏离结果? –