有没有足够的经验w/NetCDF和HDF5给出一些关于它们的优缺点作为存储科学数据的方式?
我已经使用过HDF5并希望通过Java进行读/写,但是接口本质上是C库的包装器,我发现这让人感到困惑,所以NetCDF看起来很吸引人,但我几乎一无所知.
编辑:我的应用程序"仅"用于数据记录,因此我得到一个具有自描述格式的文件.对我来说,重要的功能是能够添加任意元数据,具有快速写入访问权限以附加到字节数组,以及具有单写入器/多读取器并发(强烈首选但不是必须的.NetCDF文档说他们有SWMR但是没有不能说它们是否支持任何机制来确保两个作者不能同时打开同一个文件并带来灾难性后果.我喜欢HDF5的层次结构(特别是我喜欢有向无环图层次结构,比"常规"文件系统类层次结构更灵活),现在正在阅读NetCDF文档...如果它只允许一个数据集文件然后它可能不适合我.:(
更新 - 看起来像NetCDF-Java从netCDF-4文件读取,但只从不支持分层组的netCDF-3文件写入.织补.
更新2009年7月14日:我开始对Java中的HDF5感到非常不满.可用的库不是很好,它有一些主要的绊脚石,与Java的抽象层(复合数据类型)有关.C的一个很好的文件格式,但看起来我只是输了.> :(
我有一个扁平的字典,我想把它变成一个嵌套的字典
flat = {'X_a_one': 10,
'X_a_two': 20,
'X_b_one': 10,
'X_b_two': 20,
'Y_a_one': 10,
'Y_a_two': 20,
'Y_b_one': 10,
'Y_b_two': 20}
Run Code Online (Sandbox Code Playgroud)
我想将其转换为表单
nested = {'X': {'a': {'one': 10,
'two': 20},
'b': {'one': 10,
'two': 20}},
'Y': {'a': {'one': 10,
'two': 20},
'b': {'one': 10,
'two': 20}}}
Run Code Online (Sandbox Code Playgroud)
扁平字典的结构使得模糊不应存在任何问题.我希望它适用于任意深度的字典,但性能并不是真正的问题.我已经看到很多用于展平嵌套字典的方法,但基本上没有用于嵌套扁平字典的方法.存储在字典中的值是标量或字符串,永远不会迭代.
到目前为止,我有一些可以接受输入的东西
test_dict = {'X_a_one': '10',
'X_b_one': '10',
'X_c_one': '10'}
Run Code Online (Sandbox Code Playgroud)
到输出
test_out = {'X': {'a_one': '10',
'b_one': '10',
'c_one': '10'}}
Run Code Online (Sandbox Code Playgroud)
使用代码
def nest_once(inp_dict):
out = {}
if isinstance(inp_dict, dict):
for key, val in inp_dict.items():
if '_' …Run Code Online (Sandbox Code Playgroud) 我被要求更改当前导出.Rdata文件的软件,以便以"平台无关的二进制格式"导出,例如HDF5或netCDF.有两个原因:
我还发现 "R数据导入导出手册"没有讨论Rdata文件,尽管它确实讨论了HDF5和netCDF.
一对R-帮助的讨论表明,.Rdata文件是平台无关的.
多年来我一直用它ggplot2来绘制气候网格数据.这些通常是预计的NetCDF文件.单元格在模型坐标中是方形的,但取决于模型使用的投影,在现实世界中可能不是这样.
我通常的方法是首先在合适的常规网格上重新映射数据,然后绘图.这引入了对数据的小修改,通常这是可以接受的.
但是,我已经确定这已经不够好了:我想直接绘制投影数据而不重新映射,因为其他程序(例如ncl)可以,如果我没有弄错的话,可以不触及模型输出值.
但是,我遇到了一些问题.我将从下面逐步详细介绍可能的解决方案,从最简单到最复杂,以及它们的问题.我们能克服它们吗?
#Load packages
library(raster)
library(ggplot2)
#This gives you the starting data, 's'
load(url('https://files.fm/down.php?i=kew5pxw7&n=loadme.Rdata'))
#If you cannot download the data, maybe you can try to manually download it from http://s000.tinyupload.com/index.php?file_id=04134338934836605121
#Check the data projection, it's Lambert Conformal Conic
projection(s)
#The data (precipitation) has a 'model' grid (125x125, units are integers from 1 to 125)
#for each point a lat-lon value is also assigned
pr …Run Code Online (Sandbox Code Playgroud) 获取当前节点的父节点名称的正确语法是什么?我知道这是关于AxisName的父级,但是什么是正确的语法?例如以下xml
<netcdf xmlns="http://www.unidata.ucar.edu/namespaces/netcdf/ncml-2.2" location="file:/dev/null" iosp="lasp.tss.iosp.ValueGeneratorIOSP" start="0" increment="1">
<attribute name="title" value="Vector time series"/>
<dimension name="time" length="100"/>
<variable name="time" shape="time" type="double">
<attribute name="units" type="String" value="seconds since 1970-01-01T00:00"/>
</variable>
<group name="Vector" tsdsType="Structure" shape="time">
<variable name="x" shape="time" type="double"/>
<variable name="y" shape="time" type="double"/>
<variable name="z" shape="time" type="double"/>
</group>
</netcdf>
Run Code Online (Sandbox Code Playgroud)
对于元素变量,我应该得到netcdf或group.提前致谢.
我有一个光栅堆栈,stk由R中的三个光栅图像组成.这是一个简单的例子
# set up a raster stack with three layers
> library(raster)
> r <- raster(nrows=10,ncols=10)
> r[] <- rnorm(100)
> stk <- stack(r,r,r)
# layer names are set by default
> names(stk)
[1] "layer.1" "layer.2" "layer.3"
Run Code Online (Sandbox Code Playgroud)
我为栅格图层指定了名称:
# set layer names to "one", "two" and "three"
> names(stk) <- c('one','two','three')
> names(stk)
[1] "one" "two" "three"
Run Code Online (Sandbox Code Playgroud)
当我使用以下命令将RasterStack写入GeoTiff(多层)时:
writeRaster(stk,"myStack.tif", format="GTiff")
Run Code Online (Sandbox Code Playgroud)
根据文件名重命名图层(见> names(stk)下文).
当我读入光栅堆栈时:
> stk <- stack("myStack.tif")
# the layer names have been set automatically based …Run Code Online (Sandbox Code Playgroud) 圣诞节快乐.我仍然是Python和熊猫的新手所以非常感谢帮助.
我试图读取netCDF文件,我可以做,然后将其导入到Pandas Dataframe中.netcDF文件是2D的,所以我只想"转储它".我已经尝试过DataFrame方法,但它无法识别该对象.大概我需要将netCDF对象转换为2D numpy数组?再次感谢有关最佳方法的任何想法.祝福杰森
我正在使用python读取netcdf文件,需要在python中使用matplotlib库绘制图形.netcdf文件包含3个变量uv和w组件.我必须在垂直范围内绘制这3个组件.因为这些数据将用于天气预报雷达.我需要在拐角处用光滑的曲线绘制这些图形.现在的情节看起来
而代码是......
from netCDF4 import Dataset
from pylab import *
import numpy
from scipy import interpolate
from scipy.interpolate import spline
#passing the filename
root_grp=Dataset('C:\\Python27\\MyPrograms\\nnt206rwpuvw.nc')
#getting values of u component
temp1 = root_grp.variables['ucomponent']
data1 = temp1[:]
u=data1[0]
#getting values of v component
temp2 = root_grp.variables['wcomponent']
data2 = temp2[:]
v=data2[0]
#getting values of w component
temp3 = root_grp.variables['wcomponent']
data3 = temp3[:]
w=data3[0]
#creating a new array
array=0.15*numpy.arange(1,55).reshape(1,54)
#aliasing
y=array[0]
#sub-plots
f, (ax1, ax2, ax3) = plt.subplots(1,3, sharey=True)
ax1.plot(u,y,'r')
ax2.plot(v,y,'g')
ax3.plot(w,y,'b')
#texts
ax1.set_title('u …Run Code Online (Sandbox Code Playgroud) 我有一些大的netCDF文件,包含0.5度分辨率的地球的6小时数据.
每年有360个纬度点,720个经度点和1420个时间点.我有两个年度文件(12 GB ea)和一个110年数据(1.3 TB)的文件存储为netCDF-4(这里是1901年数据的一个例子,1901.nc,它的使用政策,以及原始,公共我开始使用的文件).
根据我的理解,从一个netCDF文件中读取它应该更快,而不是循环遍历由year和最初提供的变量分隔的文件集.
我想提取每个网格点的时间序列,例如从特定纬度和经度开始10或30年.但是,我发现这很慢.例如,从点位置读取10个值需要0.01秒,尽管我可以在0.002秒内从单个时间点读取10000个值的全局切片(维度的顺序是lat,lon,时间):
## a time series of 10 points from one location:
library(ncdf4)
met.nc <- nc_open("1901.nc")
system.time(a <- ncvar_get(met.nc, "lwdown", start = c(100,100,1),
count = c(1,1,10)))
user system elapsed
0.001 0.000 0.090
## close down session
## a global slice of 10k points from one time
library(ncdf4)
system.time(met.nc <- nc_open("1901.nc"))
system.time(a <- ncvar_get(met.nc, "lwdown", start = c(100,100,1),
count = c(100,100,1)))
user system elapsed
0.002 0.000 0.002
Run Code Online (Sandbox Code Playgroud)
我怀疑这些文件是为了优化空间层的读取而编写的,因为a)变量的顺序是lat,lon,time,b)这将是生成这些文件的气候模型的逻辑顺序和c)因为全局范围是最常见的可视化. …
我有一个非常大的netCDF文件,我正在使用python中的netCDF4阅读
我无法一次读取此文件,因为它的尺寸(1200 x 720 x 1440)太大,整个文件不能同时在内存中.第一维代表时间,下一个分别代表纬度和经度.
import netCDF4
nc_file = netCDF4.Dataset(path_file, 'r', format='NETCDF4')
for yr in years:
nc_file.variables[variable_name][int(yr), :, :]
Run Code Online (Sandbox Code Playgroud)
然而,一次阅读一年是非常缓慢的.如何加快以下用例的速度?
- 编辑
chunksize是1
我可以阅读一系列年份:nc_file.variables [variable_name] [0:100,:,]
有几个用例:
多年来:
numpy.ma.sum(nc_file.variables[variable_name][int(yr), :, :])
Run Code Online (Sandbox Code Playgroud)# Multiply each year by a 2D array of shape (720 x 1440)
for yr in years:
numpy.ma.sum(nc_file.variables[variable_name][int(yr), :, :] * arr_2d)
Run Code Online (Sandbox Code Playgroud)
# Add 2 netcdf files together
for yr in years:
numpy.ma.sum(nc_file.variables[variable_name][int(yr), :, :] +
nc_file2.variables[variable_name][int(yr), :, :])
Run Code Online (Sandbox Code Playgroud)