我有一些HDF5格式的每日原始海风数据,想知道如何使用Numpy将它们转换为风速和风向?
每日原始海风数据存储在两个HDF5文件中:u.hdf5和v.hdf5。每个HDF5文件包含三个内容:纬度,经度,u(或v).u(或v)数组是3D,0维表示小时(0:00-24:00)。我需要做的是将u和v数组切成每小时(即0:00-1:00),然后使用以下代码将它们转换为风速和风向:
#!/usr/bin/python2
import os
import sys
import math
def d2r(degree):
radian = degree * math.pi / 180.0
return (radian)
def r2d(radian):
degree = radian * 180.0 / math.pi
return (degree)
def uv2sd(u,v):
s = math.sqrt((u*u)+(v*v))
radian = math.atan2(u,v)
degree = r2d(radian)
if degree < 0:
degree = 360 + degree
return (s,d)
之后我需要创建另一个包含纬度,经度和每小时风速以及风向(s,d)信息的HDF5文件。
非常感谢!
我尝试使用下面的代码,但它不起作用:
>>> import numpy
>>> import h5py
>>> import os
>>> import sys
>>> import math
>>> a=h5py.File('D:/Wind/u_100m/20100101.hdf5','r')
>>> b=a['u'].value
>>> c=b[0,:,:]
>>> cu=c
>>> d=h5py.File('D:/Wind/v_100m/20100101.hdf5','r')
>>> e=d['v'].value
>>> f=e[0,:,:]
>>> fv=f
>>> u=cu.reshape(-1)
>>> v=fv.reshape(-1)
>>> def d2r(d):
r=d*math.pi/180.0
return(r)
>>> def r2d(r):
d=r*180.0/math.pi
return(d)
>>> def uv2sd(u,v):
s=math.sqrt((u*u)+(v*v))
d=math.atan2(u,v)
if d<0:
d=360+d
return (s,d)
>>> print uv2sd(u,v)
Traceback (most recent call last):
File "<pyshell#55>", line 1, in <module>
print uv2sd(u,v)
File "<pyshell#54>", line 2, in uv2sd
s=math.sqrt((u*u)+(v*v))
TypeError: only length-1 arrays can be converted to Python scalars
答案 0 :(得分:1)
您希望脚本返回数组或列表的平方根,但除非您有一个元素数组或列表,否则这是不可能的!
举个例子:
import numpy as np
import math
a = np.array([2, 4, 6])
s = math.sqrt(a)
这不起作用。你会得到同样的错误:
TypeError: only length-1 arrays can be converted to Python scalars
您必须为数组的每个元素调用math.sqrt
函数...例如:
for i in a:
s = math.sqrt(i)
print s
现在你会得到你想要的东西:
1.41421356237
2.0
2.44948974278
如果您对函数uv2sd
进行一些小的更改,那么您的代码应该有效:
def uv2sd(u,v):
s = []
d = []
for i in range(len(u)):
angulo = math.atan2(u[i],v[i])
if angulo < 0:
angulo = 360 + angulo
d.append(angulo)
s.append(math.sqrt((u[i]*u[i])+(v[i]*v[i])))
return s, d
答案 1 :(得分:0)
struct 模块用于处理二进制打包数据
您可以读取和写入字符数组(即字符串)到外部文件,并将它们转换为python存储类型。
您所要做的就是根据理解HDF5的结构创建一个函数或类
e.g。
import struct
f=open("infile.dat","rb")
s=struct.Struct('fl')
BLOCKSIZE=s.size()
mydata=[]
data=f.read()
f.close()
for p in range(0,len(data),BLOCKSIZE):
b=data[p:p+BLOCKSIZE]
mydata.append(s.unpack(b))
print mydata