卫星图像NoData像素坐标生成:3D NumPy数组格式转换求助
实现建议
方法1:基于现有f和g转换坐标
你已经有了包含0值的行索引数组f,以及每行对应0值列索引的二维数组g,可以用列表推导式直接生成目标坐标格式:
# 生成[[列索引, 行索引], ...]格式的坐标列表 coords = [[col, row] for row, cols in zip(f, g) for col in cols]
如果需要numpy数组格式(方便后续掩膜操作),可以用numpy的向量化操作:
import numpy as np # 将g展开为一维列索引数组 cols_flat = np.concatenate(g) # 生成与列索引一一对应的行索引数组(每个行索引重复对应行的0值个数) rows_repeated = np.repeat(f, [len(cols) for cols in g]) # 合并为二维坐标数组 coords_np = np.column_stack((cols_flat, rows_repeated))
方法2:直接从图像数组提取坐标(更高效)
处理卫星图像这类大数据时,用numpy的向量化操作比遍历列表效率高得多,无需先生成f和g,直接从原始二维图像数组获取所有NoData像素坐标:
import numpy as np # 假设你的图像数组为img(二维numpy数组) rows, cols = np.where(img == 0) # 生成[[列索引, 行索引], ...]格式的坐标数组 coords = np.column_stack((cols, rows))
这个方法一步到位,避免了手动遍历行和列的繁琐操作,性能更优。
为什么你之前的np.dstack不生效?
np.dstack会将f扩展为与g维度匹配的数组,但它是把整个f数组作为每个坐标对的第二个元素,而不是将行索引与对应行的列索引一一配对,因此无法得到目标格式。
内容的提问来源于stack exchange,提问作者Benjamin Duncan
相关产品推荐
相关产品推荐

