【问题标题】:Turn a cube into a list of data points and lists of x, y and z将立方体变成数据点列表和 x、y 和 z 列表
【发布时间】:2017-10-16 12:23:36
【问题描述】:

这有点远,但我想在自己写这篇文章之前先在这里问一下。

我有一个包含经度、纬度和高度坐标的 3D 数据立方体。我想要所有点的数据的 4 个 1D 向量,即 lon、lat、height 和 data。这样我就可以将其作为包含位置的点列表写入 ASCII 文件。通过重塑对数据执行此操作很容易,但更棘手的部分是将坐标转换为正确的向量。

有没有人已经这样做并有一些提示?

【问题讨论】:

    标签: python-iris


    【解决方案1】:

    我不能 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 数组,然后您可以像处理数据一样处理数组。

    【讨论】:

    • 谢谢,这样可以。我认为 meshgrid 也会很有用,很好。
    • 使用meshgrid,我遇到的问题是确保我真的为每个数据点拥有正确的坐标。所以数据将简单地由 cube.data.reshape() 给出。但是,我不知道是否可以依赖多维数据集数据以特定顺序(c 或 fortran)或如何确保 mesgrid 的参数顺序与此相对应。这一切都变得相当复杂......
    【解决方案2】:

    另一种选择是使用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 本身就是依靠这些排序来确保其坐标点值描述正确的数据值!

    【讨论】:

      猜你喜欢
      • 2017-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多