- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我使用 Python 并有一个数组,其值为 1.0 、 2.0 、 3.0 、 4.0 、 5.0 、 6.0 和 np.nan 作为 NoData。
我想用一个值填充所有“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):
1 1 1 1 1
1 n n n 2
1 n n 2 1
1 3 2 3 1
这里“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(列),因此它使用同一列周围的大部分值。例如:
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的方法。有什么建议或想法吗?
补充:
在我添加 Martin Valgur 的非常有用的改进之后,您可以在此处看到结果。
将“0”视为海洋(蓝色),将其他值 (> 0) 视为陆地(红色)。
如果有一个被陆地包围的“小”海(海的大小可以再次为 1-5 像素),它将得到陆地,正如您在结果图像中成功看到的那样。如果被包围的海域大于 5px 或在陆地之外,海域将不会获得陆地(这在图像中不可见,因为事实并非如此)。
如果有 1 像素的“nan”,其中海洋比陆地多,它仍然会变成陆地(在这个例子中它有 50/50)。
下图是我需要的。在海洋(值=0)和陆地(值>0)的边界处,“nan”像素需要获取大部分陆地值的值。
这听起来很难,我希望我能生动地解释它。
最佳答案
使用 label()
的可能解决方案和 binary_dilation()
来自 scipy.ndimage
:
import numpy as np
from scipy.ndimage import label, binary_dilation
from collections import Counter
def impute(arr):
imputed_array = np.copy(arr)
mask = np.isnan(arr)
labels, count = label(mask)
for idx in range(1, count + 1):
hole = labels == idx
surrounding_values = arr[binary_dilation(hole) & ~hole]
most_frequent = Counter(surrounding_values).most_common(1)[0][0]
imputed_array[hole] = most_frequent
return imputed_array
编辑:关于你松散相关的后续问题,你可以扩展上面的代码来实现你所追求的:
import numpy as np
from scipy.ndimage import label, binary_dilation, binary_closing
def fill_land(arr):
output = np.copy(arr)
# Fill NaN-s
mask = np.isnan(arr)
labels, count = label(mask)
for idx in range(1, count + 1):
hole = labels == idx
surrounding_values = arr[binary_dilation(hole) & ~hole]
output[hole] = any(surrounding_values)
# Fill lakes
land = output.astype(bool)
lakes = binary_closing(land) & ~land
labels, count = label(lakes)
for idx in range(1, count + 1):
lake = labels == idx
output[lake] = lake.sum() < 6
return output
关于python - 用周围的大部分值填充孔 (Python),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41550979/
我想检测(并关闭)封闭网格的开口和孔洞/镂空部分。我知道对于一个开放的网格,这可以通过找到边界边(只属于一个三角形的边)来完成,如 here 所述。 . 但是对于不存在此类边界边的封闭网格呢?下面是一
我试过https://docs.konghq.com/getting-started-guide/2.1.x/expose-services/我也有本地服务器:kong/2.2.1我可以同时注册服务和
我在我的应用程序中使用 logback(SiftingAppender 和 RollingFileAppender)。每当请求进来时,它们将根据 url 查询中的 id 记录到不同的文件中。 这工作得
我在 ARKit 上遇到了一个问题,我需要帮助。我正在做一个小演示,我在场景中放置了一个简单的 SCNTorus 几何体,我试图将一个小球 (SCNSphere) 扔进环面孔中。问题是球在中间弹跳而不
编辑 经过更多研究但仍然没有解决方案,我添加了实质性编辑以及指向 .shp 文件的链接。 The shape file is included here 我有一个包含 9 个多边形的 SpatialP
有没有一种简单直接的方法可以使用 opencv 3.1 python 从图像中提取内部轮廓(孔)? 我知道我可以使用“区域”作为条件。但是,如果我更改图像分辨率,“区域”就不一样了。 例如,这张图片:
我正在审查 Angular 中的模板项目 引导组件有一个如下所示的 HTML 模板。很有道理。应用程序标题、应用程序侧边栏等标签将包含由带有匹配选择器的组件提供的内容。这一切都检查出来了。
案例场景: $ cat Status.txt 1,connected 2,connected 3,connected 4,connected 5,connected 6,connected 7,dis
我是一名优秀的程序员,十分优秀!