给出一个掩码数组样本和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,其中包含许多缺失值。因此,需要使用屏蔽数组和快速实现。
感谢。
答案 0 :(得分:3)
不要指望KDTree在屏蔽方面做任何特别的事情。我的猜测是它按原样使用底层数据数组。
屏蔽数组具有data
属性和mask
属性。 np.ma
函数和方法都要注意两者。但对于许多任务,他们fill
他们的数据具有合适的值,然后执行常规numpy
操作。例如,如果对行或列求和,它将用0替换被屏蔽的元素;如果服用1s产品。
研究KDTree文档。如果他们说使用蒙面数组,那么请按照这些说明操作。但如果你没有找到任何东西,它可能会忽略面具。
查看KDTree
代码。它是init
以:
def __init__(self, data, leafsize=10):
self.data = np.asarray(data)
....
看看np.asarray(madata)
。结果是潜在的data
;不再是一个蒙面数组了。因此屏蔽数组没有任何区别。
看看数据中存在Nan时会发生什么:
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
代码,但它看起来只是让nans的正常numpy
处理发生。它没什么特别的。
你能省略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.]])