【问题标题】:Extending a series of nonuniform netcdf data in a numpy array在 numpy 数组中扩展一系列不均匀的 netcdf 数据
【发布时间】:2011-02-08 05:37:38
【问题描述】:

我是 python 新手,如果已经问过这个问题,我深表歉意。

使用 python 和 numpy,我试图通过迭代调用 append() 将许多 netcdf 文件中的数据收集到一个数组中。

天真地,我正在尝试做这样的事情:

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) 文件沿轴 0 的大小不一定相同(但沿后续轴的大小应该相同),因此我需要事先从每个文件中读取数组大小以预先计算 x 的最终大小。

不过……

2) 据我所知,pupynere(和其他 netcdf 模块)在打开文件时将整个文件加载到内存中,而不仅仅是一个引用(例如其他环境中的许多 netcdf 模块)。所以要预先分配,我必须打开文件两次。

据我所知,有很多 (>100) 个大 (>1GB) 文件,因此过度分配和重塑是不切实际的。

我的第一个问题是我是否错过了一些预分配的智能方法。

我的第二个问题更严重。上面的 sn-p 适用于一维数组。但是如果我尝试加载一个矩阵,那么初始化就会成为一个问题。我可以将一维数组附加到一个空数组:

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

但我不能将空数组附加到矩阵:

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

我相信像 x.extend(xFragment) 这样的东西会起作用,但我不认为 numpy 数组有这个功能。我也可以通过将第一个文件视为特殊情况来避免初始化问题,但如果有更好的方法,我更愿意避免这种情况。

如果有人可以提供帮助或建议,或者可以找出我的方法存在的问题,我将不胜感激。谢谢

【问题讨论】:

    标签: python arrays numpy netcdf


    【解决方案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)
    

    【讨论】:

    • netcdf 数据以 numpy 数组的形式出现,因此这将创建如下数组列表:[array(...), array(...), array(...) .. . ] 对于每个附加语句。也许如果我先将 numpy 数组转换为常规列表,然后在最后转换回 numpy 数组,这会起作用吗?
    • 在尝试了这个想法之后,我决定这可能不是我想要的。我必须在每次迭代时调用 xFragment.tolist() ,这似乎比在第一次迭代时将 x 设置为 xFragment 并在后续迭代中使用 x.append(xFragment) 有所改进。
    • x 将是 NumPy 数组的列表。这正是 concatenate 期望得到的。
    • 你是对的,当我第一次尝试你的建议时,我一定没有正确使用连接。它似乎适用于一些较小的例子。不幸的是,在这些较大的数据集上,连接似乎太慢了,或者可能根本不起作用(也许它使用了大量内存?)。我可能做错了什么,但你的建议似乎在原则上是有效的。感谢您的帮助。
    猜你喜欢
    • 2015-04-20
    • 1970-01-01
    • 1970-01-01
    • 2021-06-07
    • 1970-01-01
    • 1970-01-01
    • 2019-07-03
    • 2011-06-25
    • 2017-12-15
    相关资源
    最近更新 更多