在numpy数组中扩展一系列非均匀netcdf数据

1 投票
1 回答
1211 浏览
提问于 2025-04-15 21:37

我刚接触Python,如果这个问题之前有人问过,我先说声抱歉。

我在用Python和numpy,想把很多netcdf文件里的数据收集到一个数组里,打算通过反复调用append()来实现。

我简单地想做这样的事情:

from numpy import *
from pupynere import netcdf_file

x = array([])
y = [...some list of files...]

for file in y:
    ncfile = netcdf_file(file,'r')
    xFragment = ncfile.variables["varname"][:]
    ncfile.close()
    x = append(x, xFragment)

我知道在正常情况下,这样做不好,因为每次调用append()时都会重新分配内存。但有两个原因让我不想提前分配数组x:

1) 这些文件在第一个维度上的大小不一定相同(但在后面的维度上应该是一样的),所以我需要先从每个文件读取数组的大小,以便计算出x的最终大小。

但是……

2) 根据我的了解,pupynere(还有其他netcdf模块)在打开文件时会把整个文件加载到内存中,而不是只加载一个引用(像其他环境中的许多netcdf模块那样)。所以如果要提前分配,我就得打开文件两次。

这些文件有很多(超过100个),而且每个文件都很大(超过1GB),所以从我看来,过度分配和重塑数组并不实际。

我第一个问题是,我是否错过了什么聪明的提前分配方法。

我的第二个问题更严重。上面的代码片段适用于一维数组。但如果我想加载一个矩阵,初始化就成了问题。我可以把一个一维数组追加到一个空数组中:

append( array([]), array([1, 2, 3]) )

但我不能把一个空数组追加到一个矩阵中:

append( array([]), array([ [1, 2], [3, 4] ]), axis=0)

我相信像x.extend(xFragment)这样的方式是可行的,但我觉得numpy数组没有这个功能。我也可以通过把第一个文件当作特例来避免初始化的问题,但如果有更好的方法,我更希望不这样做。

如果有人能提供帮助或建议,或者指出我方法中的问题,我将非常感激。谢谢!

1 个回答

1

你可以通过先从文件中加载数组到一个数组列表里,然后使用 concatenate 来把所有数组连接起来,来解决这两个问题。大概是这样的:

x = [] # a normal python list, not np.array
y = [...some list of files...]

for file in y:
    ncfile = netcdf_file(file,'r')
    xFragment = ncfile.variables["varname"][:]
    ncfile.close()
    x.append(xFragment)

combined_array = concatenate(x, axis=0)

撰写回答