2012-05-02 55 views
0

我有HDF5格式一些生每天海風數據,想知道如何使用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 
+0

是的,我的意思是弧度和thx的。我對編程非常陌生,所以如果有人可以發佈很棒的代碼。但任何建議或提示也會對我有所幫助。 –

+0

我混淆了自己,uv2sd的輸入應該是(u,v)。但是我又得到了同樣的錯誤,再次說只有長度爲1的數組可以轉換爲python標量 –

+0

你應該嘗試'numpy.sqrt'和'numpy.arctan2 '。他們可以處理u和v的數組,而不僅僅是標量u和v'math.sqrt'所期望的 – yosukesabai

回答

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 

如果你做你的函數一些小的修改你的代碼應工作3210:

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 
0

結構模塊用來處理二進制壓縮數據。

您可以讀寫字符數組(即字符串)到外部文件並將它們內部轉換爲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