課題5 スライスを用いた最大値の抽出+縮小配列の作成
さて,ここでは実際の研究であったPythonの活用を考えていきましょう.とある学生I君は水理シミュレーションの結果として,4800×4800の二次元水温データを入手しました.しかし,配列が大きいためエクセルでデータを使用することができず,8×8四方のエリアから最大値を抜き出してそれを四方の代表値として縮小した配列を用いることとしました.これをNumpyとスライスを活用して実装してみましょう.
最終的なアウトプットはeveryone.pyとします.温度分布はnp.random.uniform()で10℃から30℃の間で予め生成しましょう.また,整理する前後のデータはprintでI/O出力することとし,整理後のデータは np.savetxt()でcsv出力してみましょう.
※エクセルのグラフで扱えるデータ系列の個数は255個までなので,これでもエクセルでの活用には限界があります.
※エクセルのグラフで扱えるデータ系列の個数は255個までなので,これでもエクセルでの活用には限界があります.
numpy.random.uniform([low=0.0][, high=1.0,] size=None)
lowからhighの範囲でsizeに沿った乱数配列を生成します.Lowのデフォルト設定は0.0,highは1.0となっており,sizeのみを指定した場合はrandom.randと同様の機能となります.
lowからhighの範囲でsizeに沿った乱数配列を生成します.Lowのデフォルト設定は0.0,highは1.0となっており,sizeのみを指定した場合はrandom.randと同様の機能となります.
課題6 時系列データから2h, 3h平均データを作成する
とある学生T君は教員から毎時降水量のデータを2h,3h毎の平均データに整理するように指示されました.しかし,データが膨大でエクセルで処理するのは困難です.そこでT君はPythonでデータを処理することとしました.ここでは,時間別雨量データを1年分とし,そこから平均μ=1,分散σ=1とした対数正規分布np.random.lognormalによって時間別雨量をランダムに生成します.Matplotlibによって作成した対数正規分布のヒストグラムと時系列データのグラフを示しますので参考にしてください.当然,乱数ですので人によってグラフは異なります.なお,平均値は np.averageで可能です.ファイル名はprecipitaion.pyとしましょう.
np.random.lognormal(mean=0.0, sigma=1.0, size=None)
meanとsigmaの諸元を持つ対数正規分布に沿って,大きさがsizeの乱数を生成します.
meanとsigmaの諸元を持つ対数正規分布に沿って,大きさがsizeの乱数を生成します.
回答
[課題1]
結果が正しければ出力される配列は28とか29ばかりになっているはずです.
結果が正しければ出力される配列は28とか29ばかりになっているはずです.
Everyone.py
- Base = np.random.uniform(10,30,(4800,4800)) #base temperature data
- Length = int(len(Base)/8) #len()/8 will be float, must keep integer by using int()
- Result = np.empty((Length,Length)) #shrunken temp data = 600×600
-
- for i in range(Length): #toward row
- for j in range(Length): #toward column
- row = i*8
- column = j*8
- array = Base[row:row+8,column:column+8] #slice 8×8 array
- Data = array.max()
- Result[i][j] = Data
- np.savetxt("Everyone.csv",Result,delimiter =",")
[課題2]
precipitation.py
- #define number of Data
- days = 365 # = one year
- hours = 24
- Ndata = days*hours #number of hourly data
-
- #Log-normal distribution
- mean, sigma = 1,1
- hourly_precipitation = np.random.lognormal(mean, sigma, Ndata)
-
- #Perpare resulting array
- two = np.empty(int(Ndata/2))
- three = np.empty(int(Ndata/3))
-
- #Slice hourly basis
- for i in range(int(Ndata/2)): # two hour
- sls = hourly_precipitation[i:i+1]
- data = np.average(sls)
- two[i] = data
-
- for i in range(int(Ndata/3)): # Three hour
- sls = hourly_precipitation[i:i+2]
- data = np.average(sls)
- three[i] = data
-
最終的に得られたデータをnp.savetxtしてデータの内容を確認するとなお良いでしょう.