我使用Python,有一个数组,值为1.0、2.0、3.0、4.0、5.0、6.0和np.nan公司作为野田。在
我想用一个值填充所有的“nan”。此值应为周围值的大多数。在
例如:
1 1 1 1 1
1 n 1 2 2
1 3 3 2 1
1 3 2 3 1
这个例子中的“n”应该是“nan”。它的大多数邻居的值都是1。因此,“nan”应替换为值1。在
注意,由“nan”组成的孔的大小可以是1到5。例如(最大大小为5 nan):
^{pr2}$这里“nan”的洞有以下包围值:
surrounding_values = [1,1,1,1,1,2,1,2,3,2,3,1,1,1] -> Majority = 1
我尝试了以下代码:
from sklearn.preprocessing import Imputer
array = np.array(.......) #consisting of 1.0-6.0 & np.nan
imp = Imputer(strategy="most_frequent")
fill = imp.fit_transform(array)
这个效果很好。但是,它只使用一个轴(0=列,1=行)。默认值为0(column),因此它使用同一列的大多数周围值。例如:
Array
2 1 2 1 1
2 n 2 2 2
2 1 2 2 1
1 3 2 3 1
Filled Array
2 1 2 1 1
2 1 2 2 2
2 1 2 2 1
1 3 2 3 1
所以在这里您可以看到,虽然大多数是2,但周围列的大多数值是1,因此它变成了1而不是2。在
因此,我需要找到另一个使用python的方法。有什么建议或想法吗?在
补充:
在这里你看到的结果,在我添加了非常有益的改善马丁瓦格。在
将“0”视为海(蓝色),将其他值(>0)视为陆地(红色)。在
如果有一个被陆地包围的“小”海(海洋的大小又可以是1-5像素),它将得到陆地,正如您在结果图像中成功看到的那样。如果这是陆地的话,它不会比陆地更大。在
如果有1px“nan”,海洋的大部分比陆地多,它仍然会变成陆地(在本例中,它有50/50)。在
下面的图片显示了我需要什么。在海洋(值=0)和陆地(值>0)之间的边界处,“nan”像素需要获取大部分陆地值的值。在
这听起来很难,我希望我能生动地解释。在
我没有找到任何库,所以我写了一个函数,如果在数组的中间没有,你可以使用这些
使用^{} 和^{} 来自
scipy.ndimage
的一个可能的解决方案:编辑:关于您松散相关的后续问题,您可以扩展上述代码以实现您的目标:
^{pr2}$在马丁·巴尔古尔难以置信的帮助下,我得到了我需要的结果。在
因此,我在Martins代码中添加了以下行:
相关问题 更多 >
编程相关推荐