【问题标题】:HDF5 array extraction and conversion in NumPyNumPy 中的 HDF5 数组提取和转换
【发布时间】:2012-05-02 05:47:57
【问题描述】:

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

【问题讨论】:

  • 是的,我的意思是弧度,谢谢。我对编程很陌生,所以如果有人可以发布很棒的代码。但任何建议或提示也会对我有所帮助。
  • 我自己弄糊涂了,uv2sd的输入应该是(u,v)。但是我又得到了同样的错误,说只有长度为1的数组可以转换为python标量
  • 你应该试试numpy.sqrtnumpy.arctan2。他们可以处理 u 和 v 的数组,而不仅仅是 math.sqrt 期望的标量 u 和 v

标签: python numpy hdf5


【解决方案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

【讨论】:

    【解决方案2】:

    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
    

    【讨论】:

      猜你喜欢
      • 2021-03-23
      • 1970-01-01
      • 2012-05-09
      • 2017-09-23
      • 1970-01-01
      • 2015-08-30
      • 1970-01-01
      • 2011-05-07
      • 1970-01-01
      相关资源
      最近更新 更多