将多维数据集转换为数据点列表以及x,y和z

时间:2017-10-16 12:23:36

标签: python-iris

这是一个很长的镜头,但我想在写这篇文章之前我会问这里。

我有一个带有lon,lat和height坐标的3D立方体数据。我想在所有点,lon,lat,height和data中获得数据的4个1D向量。这样我就可以将它作为带有位置的点列表写入ASCII文件。通过重塑可以很容易地为数据执行此操作,但更棘手的部分是将坐标转换为正确的向量。

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

2 个答案:

答案 0 :(得分:1)

我不是百分百肯定我已经正确理解了这个目标,但这样的事情能做到你想要的吗?

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函数探索将1-d coord.points数组转换为3-d数组,然后可以在同一个数组中处理作为数据阵列的方式。

答案 1 :(得分:1)

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