加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

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

发布时间:2020-12-16 23:24:29 所属栏目:Python 来源:网络整理
导读:我正在使用 Python中的2D Numpy masked_array. 我需要更改屏蔽区域中的数据值,使其等于最近的未屏蔽值. NB.如果有多个最近的未屏蔽值,那么它可以采用任何最接近的值(有一个最简单的代码…) 例如 import numpyimport numpy.ma as maa = numpy.arange(100).res
我正在使用 Python中的2D Numpy masked_array.
我需要更改屏蔽区域中的数据值,使其等于最近的未屏蔽值.

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

例如

import numpy
import numpy.ma as ma

a = numpy.arange(100).reshape(10,10)
fill_value=-99
a[2:4,3:8] = fill_value
a[8,8] = fill_value
a = 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 np
import numpy.ma as ma

a = 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语句并将边缘馈入不同的可接受邻居序列…

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读