[英]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.