NumPy中的HDF5阵列提取和转换

时间:2012-05-02 05:47:58

标签: python numpy hdf5

我有一些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

2 个答案:

答案 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