块状3D阵列(NetCDF数据)将同一元素切片-最快的方法

时间:2020-08-03 18:17:53

标签: python numpy netcdf4

我需要在3D numpy数组中切片相同的元素(实际上是蒙版数组,但工作原理相同)。我通常通过迭代来完成它-但是当前数据是如此之大,需要在数千个数据集上重复该过程-这将需要数周的时间(原始估算)。切片3D数组而不循环遍历所有2D数组的最快方法是什么?

在这个简单的示例中,我需要在所有2D数组中的[1, 0]的每个2D数组中切片3元素,并将它们存储在result数组中。

NetCDF示例(切片元素[500,400])

import netCDF4

url = "http://eip.ceh.ac.uk/thredds/dodsC/public-chess/PET/aggregation/PETAggregation.ncml"
dataset = netCDF4.Dataset(url)

result = dataset.variables['pet'][:, 500, 400]

myarray已被取代

myarray = np.array([
    [[1, 2], [3, 4], [5, 6]],
    [[1, 2], [3, 4], [5, 6]],
    [[1, 2], [3, 4], [5, 6]],
    [[1, 2], [3, 4], [5, 6]],
])

result = []
for i in myarray:
    result.append(i[1][0])

结果[3, 3, 3, 3]

编辑 FirefoxMetzger建议将其简单地切成薄片 result = myarray[:, 1, 0]。但是,我收到以下错误消息:

RuntimeError:NetCDF:DAP服务器错误

1 个答案:

答案 0 :(得分:1)

您提供的最小numpy示例可以使用标准切片机制进行有效切片:

myarray = np.array([
    [[1, 2], [3, 4], [5, 6]],
    [[1, 2], [3, 4], [5, 6]],
    [[1, 2], [3, 4], [5, 6]],
    [[1, 2], [3, 4], [5, 6]],
])

result = myarray[:, 1, 0]

NetCFD似乎是由于结果片太大而无法从服务器返回而导致崩溃。根据您的评论,此处的解决方案是按块查询服务器并在本地汇总结果。