我使用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}}
答案 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.require
(http://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之前)我很感激。