在Python numpy屏蔽数组中填入最近邻的缺失值?

在Python numpy屏蔽数组中填入最近邻的缺失值?,第1张

概述我正在使用 Python中的2D Numpy masked_array. 我需要更改屏蔽区域中的数据值,使其等于最近的未屏蔽值. NB.如果有多个最近的未屏蔽值,那么它可以采用任何最接近的值(有一个最简单的代码…) 例如 import numpyimport numpy.ma as maa = numpy.arange(100).reshape(10,10)fill_value=-99a 我正在使用 Python中的2D Numpy masked_array.
我需要更改屏蔽区域中的数据值,使其等于最近的未屏蔽值.

NB.如果有多个最近的未屏蔽值,那么它可以采用任何最接近的值(有一个最简单的代码…)

例如

import numpyimport numpy.ma as maa = numpy.arange(100).reshape(10,10)fill_value=-99a[2:4,3:8] = fill_valuea[8,8] = fill_valuea = ma.masked_array(a,a==fill_value)>>> a  [[0 1 2 3 4 5 6 7 8 9]  [10 11 12 13 14 15 16 17 18 19]  [20 21 22 -- -- -- -- -- 28 29]  [30 31 32 -- -- -- -- -- 38 39]  [40 41 42 43 44 45 46 47 48 49]  [50 51 52 53 54 55 56 57 58 59]  [60 61 62 63 64 65 66 67 68 69]  [70 71 72 73 74 75 76 77 78 79]  [80 81 82 83 84 85 86 87 -- 89]  [90 91 92 93 94 95 96 97 98 99]],

>我需要它看起来像这样:

06001

NB.哪里“?”可以取任何相邻的未屏蔽值.

最有效的方法是什么?

谢谢你的帮助.

解决方法 您可以使用np.roll进行移位的副本,然后在掩码上使用布尔逻辑来识别要填充的点:
import numpy as npimport numpy.ma as maa = np.arange(100).reshape(10,a==fill_value)print(a)# [[0 1 2 3 4 5 6 7 8 9]#  [10 11 12 13 14 15 16 17 18 19]#  [20 21 22 -- -- -- -- -- 28 29]#  [30 31 32 -- -- -- -- -- 38 39]#  [40 41 42 43 44 45 46 47 48 49]#  [50 51 52 53 54 55 56 57 58 59]#  [60 61 62 63 64 65 66 67 68 69]#  [70 71 72 73 74 75 76 77 78 79]#  [80 81 82 83 84 85 86 87 -- 89]#  [90 91 92 93 94 95 96 97 98 99]]for shift in (-1,1):    for axis in (0,1):                a_shifted=np.roll(a,shift=shift,axis=axis)        IDx=~a_shifted.mask * a.mask        a[IDx]=a_shifted[IDx]print(a)# [[0 1 2 3 4 5 6 7 8 9]#  [10 11 12 13 14 15 16 17 18 19]#  [20 21 22 13 14 15 16 28 28 29]#  [30 31 32 43 44 45 46 47 38 39]#  [40 41 42 43 44 45 46 47 48 49]#  [50 51 52 53 54 55 56 57 58 59]#  [60 61 62 63 64 65 66 67 68 69]#  [70 71 72 73 74 75 76 77 78 79]#  [80 81 82 83 84 85 86 87 98 89]#  [90 91 92 93 94 95 96 97 98 99]]

如果你想要使用更大的最近邻居,你可能会这样做:

neighbors=((0,1),(0,-1),(1,0),(-1,2),-2),(2,(-2,0))

请注意,邻居中元素的顺序很重要.你可能想要用最近的邻居填写缺失的值,而不是任何邻居.可能有一个更聪明的方式来生成邻居序列,但是我目前还没有看到它.

a_copy=a.copy()for hor_shift,vert_shift in neighbors:    if not np.any(a.mask): break    a_shifted=np.roll(a_copy,shift=hor_shift,axis=1)    a_shifted=np.roll(a_shifted,shift=vert_shift,axis=0)    IDx=~a_shifted.mask*a.mask    a[IDx]=a_shifted[IDx]

请注意,np.roll高兴地将下边缘滚动到顶部,因此顶部的缺失值可能会从底部的值填充.如果这是一个问题,我将不得不考虑如何解决它.明显但不是很聪明的解决方案是使用if语句并将边缘馈入不同的可接受邻居序列…

总结

以上是内存溢出为你收集整理的在Python numpy屏蔽数组中填入最近邻的缺失值?全部内容,希望文章能够帮你解决在Python numpy屏蔽数组中填入最近邻的缺失值?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1207080.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存