NumPy中HDF5阵列的提取与转换

2024-09-30 06:18:48 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

非常感谢!在


我尝试使用下面的代码,但没有成功:

^{pr2}$

Tags: 文件数据importreturndefmathhdf5小时
2条回答

您希望脚本返回数组或列表的平方根,但这是不可能的,除非您有一个元素数组或列表!在

例如:

import numpy as np
import math

a = np.array([2, 4, 6])
s = math.sqrt(a)

这行不通。您将得到相同的错误:

^{pr2}$

必须为数组的每个元素调用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

struct模块用于操作二进制压缩数据。

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

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

例如

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

相关问题 更多 >

    热门问题