gpt4 book ai didi

python - 带屏蔽数组的 KDTree

转载 作者:太空宇宙 更新时间:2023-11-04 00:52:19 24 4
gpt4 key购买 nike

给定一个样本屏蔽数组和一个 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 x 20,其中包含许多缺失值。因此需要使用掩码数组和快速实现。

谢谢。

最佳答案

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

掩码数组具有 data 属性和 mask 属性。 np.ma 的函数和方法都兼顾了。但是对于许多任务,他们用合适的值填充他们的数据,然后执行常规的 numpy 操作。例如,如果对行或列求和,它将用 0 替换被屏蔽的元素;如果拿一个产品,用1s。

研究 KDTree 文档。如果他们说了一些关于使用掩码数组的内容,请按照这些说明进行操作。但如果您没有找到任何东西,它可能会忽略掩码。


查看KDTree代码。它的 init 开始于:

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

查看 np.asarray(madata)。结果是底层的数据;不再是蒙面数组。所以屏蔽数组没有区别。


看看当数据中有 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)

默认设置是在 session (或上下文)中第一次遇到时显示这样的警告。

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 点吗?

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

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.]])

关于python - 带屏蔽数组的 KDTree,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36585998/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com