【发布时间】:2017-10-16 12:23:36
【问题描述】:
这有点远,但我想在自己写这篇文章之前先在这里问一下。
我有一个包含经度、纬度和高度坐标的 3D 数据立方体。我想要所有点的数据的 4 个 1D 向量,即 lon、lat、height 和 data。这样我就可以将其作为包含位置的点列表写入 ASCII 文件。通过重塑对数据执行此操作很容易,但更棘手的部分是将坐标转换为正确的向量。
有没有人已经这样做并有一些提示?
【问题讨论】:
标签: python-iris
这有点远,但我想在自己写这篇文章之前先在这里问一下。
我有一个包含经度、纬度和高度坐标的 3D 数据立方体。我想要所有点的数据的 4 个 1D 向量,即 lon、lat、height 和 data。这样我就可以将其作为包含位置的点列表写入 ASCII 文件。通过重塑对数据执行此操作很容易,但更棘手的部分是将坐标转换为正确的向量。
有没有人已经这样做并有一些提示?
【问题讨论】:
标签: python-iris
我不能 100% 确定我是否正确理解了目标,但是这样的东西会达到你想要的效果吗?
lats = []
lons = []
heights = []
data = []
for point_cube in cube.slices_over(['latitude', 'longitude', 'height']):
lats.append(point_cube.coord('latitude').points[0])
lons.append(point_cube.coord('longitude').points[0])
heights.append(point_cube.coord('height').points[0])
data.append(point_cube.data)
或者为了更高效(几乎可以肯定),您可以探索使用 numpy.meshgrid 函数将您的一维 coord.points 数组转换为 3-d 数组,然后您可以像处理数据一样处理数组。
【讨论】:
另一种选择是使用itertools 构建所有坐标点的乘积并展平立方体的数据数组:
points_prod = itertools.product(cube.coord('height').points,
cube.coord('latitude').points,
cube.coord('longitude').points)
flat_data = cube.data.reshape(-1)
itertools 产品是一个生成器,我们可以通过将其转换为列表来使用它。然后我们可以索引产品列表和展平的数据数组。产品列表的索引i 将是扁平数据数组中数据值i 的坐标点:
points_prod_list = list(points_prod)
print '{} -- {}'.format(points_prod_list[i], flat_data[i])
考虑特定的数据排序并确保每个数据点都有正确的坐标...
只要您获得的尺寸顺序与它们的打印顺序相同,这将始终将正确的坐标点值链接到这些点值描述的数据值。
这很难描述,但可以简单地使用上面的代码来合理地演示。它涉及到这样一个事实,即第一个打印的维度坐标描述了立方体数据数组的最外轴,以及 itertools.product 创建所有输入组合的乘积的顺序,以及 NumPy 展平数组的顺序。但从根本上说,Iris 本身就是依靠这些排序来确保其坐标点值描述正确的数据值!
【讨论】: