我正在使用
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语句并将边缘馈入不同的可接受邻居序列…