簡體   English   中英

NumPy中的HDF5數組提取和轉換

[英]HDF5 array extraction and conversion in NumPy

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

您希望腳本返回數組或列表的平方根,但這是不可能的,除非您擁有一個元素數組或列表!

舉個例子:

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM