0

我有一些 HDF5 格式的原始每日海风数据,想知道如何使用 Numpy 将它们转换为风速和风向?</p>

原始的每日海风数据存储在两个 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)

之后,我需要创建另一个 HDF5 文件,其中包含纬度、经度和每小时风速和风向 (s,d) 信息。

非常感谢!


我尝试使用下面的代码,但没有奏效:

>>> 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
4

2 回答 2

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
于 2012-05-02T13:40:08.580 回答
0

struct模块用于操作二进制打包数据。

您读取和写入字符数组(即字符串)到外部文件,并在内部将它们转换为 python 存储类型。

您所要做的就是创建一个基于理解 HDF5 的结构的函数或类

例如

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
于 2012-05-02T06:44:35.087 回答