首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有掩码数组的KDTree

具有掩码数组的KDTree
EN

Stack Overflow用户
提问于 2016-04-13 07:41:57
回答 1查看 500关注 0票数 2

给定样本掩码数组和KDTree上的查询,

代码语言:javascript
复制
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 x 20,其中包含许多缺失值。因此,需要使用掩码数组和快速实现。

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2016-04-13 08:14:14

不要指望KDTree对掩码做任何特殊的事情。我的猜测是它按原样使用底层数据数组。

掩码数组具有data属性和mask属性。np.ma函数和方法都注意到了这两点。但对于许多任务,它们会将数据fill为合适的值,然后执行常规的numpy操作。例如,如果对行或列求和,它将用0替换被屏蔽的元素;如果取乘积,则用1。

研究KDTree文档。如果他们说了一些关于使用掩码数组的事情,那么就按照这些说明去做。但是如果你没有找到任何东西,它可能会忽略这个掩码。

看看KDTree代码。它的init开头是:

代码语言:javascript
复制
def __init__(self, data, leafsize=10):
    self.data = np.asarray(data)
    ....

看看np.asarray(madata)吧。结果是底层的data;不再是一个掩码数组。所以屏蔽数组并没有什么不同。

看看当数据中有Nan时会发生什么:

代码语言:javascript
复制
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)

默认设置是在会话(或上下文)中第一次遇到此类警告时显示此类警告。

代码语言:javascript
复制
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处理nans发生。它没有什么特别之处。

你能省略NaN点吗?

压缩的掩码数组可能不是您想要的,因为它返回数组的展平版本:

代码语言:javascript
复制
In [268]: madata.compressed()
Out[268]: array([ 0.,  1.,  2.,  3.,  5.,  6.,  7.,  8.])

或者填满一些有用的东西?

代码语言:javascript
复制
In [271]: madata.filled(999)
Out[271]: 
array([[   0.,    1.,    2.],
       [   3.,  999.,    5.],
       [   6.,    7.,    8.]])
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36585998

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档