0

HDF5 形式の生の毎日の海風データがあり、Numpy を使用してそれらを風速と風向に変換する方法を知りたいですか?</p>

生の毎日の海風データは、u.hdf5 と v.hdf5 の 2 つの HDF5 ファイルに保存されます。各 HDF5 ファイルには、緯度、経度、u(または v) の 3 つのコンテンツが含まれています。u(または v) 配列は 3D で、0 次元は時間 (0:00-24:00) を表します。私がする必要があるのは、u と v の配列を 1 時間ごと (つまり 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
4

2 に答える 2

1

スクリプトが配列またはリストの平方根を返すようにしたいのですが、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
于 2012-05-02T13:40:08.580 に答える
0

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
于 2012-05-02T06:44:35.087 に答える