如何使从netCDF(.nc)加载的数组可写?

时间:2015-06-02 17:42:28

标签: python arrays numpy io netcdf

我使用python .nc模块从netcdf(scipy.io.netcdf)文件加载一些变量。在我从中加载它们的文件中,缺少的数据的填充值为99999,我想从numpy更改为np.nan

我导入变量并将其分配给numpy数组后,我无法清理99999填充值,因为我得到了:

    RuntimeError: array is not writeable

我试图将数组writeable的属性更改为True但返回:

    ValueError: cannot set WRITEABLE flag to True of this array

所以我不知所措。我的代码的简化版本和几个示例输出如下。这里有人有什么建议吗?最初我使用的是netCDF4而不是scipy.io.netcdf,在这种情况下我会设置nc.set_auto_mask(False)但是我还没有看到scipy.io中的类似属性所以我刚刚离开那个。

示例代码:

    import scipy.io as sio
    import numpy as np

    nc = sio.netcdf.netcdf_file('filename.nc','r') # open file
    arr = nc.variables['PARAMETER'][:] # load into np array
    output_arr = cleanarr(arr) # replace filler 99999 vals with np.nan
    nc.close()

值得注意的是,如果我在nc.close()之前或之后cleanarr(arr) type(arr) <type 'numpy.ndarray'> arr.flags C_CONTIGUOUS : True F_CONTIGUOUS : False OWNDATA : False WRITEABLE : False ALIGNED : True UPDATEIFCOPY : False 似乎并不重要

示例输出:

{{1}}

2 个答案:

答案 0 :(得分:2)

来自文档

http://docs.scipy.org/doc/scipy-0.15.1/reference/generated/scipy.io.netcdf.netcdf_file.html

NetCDF files, when opened read-only, return arrays that refer directly to memory-mapped data on disk:

>>>
>>> data = time[:]
>>> data.base.base
<mmap.mmap object at 0x7fe753763180>
If the data is to be processed after the file is closed, it needs to be copied to main memory:

>>>
>>> data = time[:].copy()
>>> f.close()
>>> data.mean()

我认为在早期的SO问题中也已经解决了这个问题,尽管我没有花时间去研究这些问题。

答案 1 :(得分:1)

使用np.requirehttp://docs.scipy.org/doc/numpy/reference/generated/numpy.require.html)来更改标志,而不是我正在使用的原始方法。代码现在看起来像:

    import scipy.io as sio
    import numpy as np

    nc = sio.netcdf.netcdf_file('filename.nc','r') # open file
    arr = nc.variables['PARAMETER'][:] # load into np array
    arr = np.require(arr,dtype='f4',requirements=['O','W'])
    output_arr = cleanarr(arr) # replace filler 99999 vals with np.nan
    nc.close()

这似乎可以完成这项工作,但是如果有人可以评论我的答案的有效性是否应该或不应该一般地进行(我觉得我在这里强迫某些东西,我从未使用过{{1之前)我很感激。