#author("2023-06-30T13:29:57+09:00","external:moriat","moriat") #author("2023-06-30T13:30:47+09:00","external:moriat","moriat") #topicpath ** numpy [#gbedae22] - 概要~ Python そのものは数値計算に向かない。だから特別なライブラリが必要になる。~ それが numpy である。~ ChatGPT に次のように聞いてみた。その結果を利用して学習する。~ Pythonでnumpy を使いこなすための例題を示して - 定義と基本的な量と参照~ #code(python){{ import numpy as np # 1次元配列の作成 arr1 = np.array([1, 2, 3, 4, 5]) print(arr1) # 2次元配列の作成 arr2 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) print(arr2) # 3次元配列の作成 arr3 = np.array([ [[1.0, 2, 3], [4, 5, 6], [7, 8, 9]], [[-1, -2, -3], [-4, -5, -6], [-7, -8, -9]]]) print(arr3) # 配列の形状の確認 print(arr1.shape) print(arr2.shape) print(arr3.shape) # 配列の要素数の確認 print(arr1.size) print(arr2.size) print(arr3.size) # 配列のデータ型の確認 print(arr1.dtype) print(arr2.dtype) print(arr3.dtype) # データの参照 print( arr1[2] ) # 3つめ print( arr2[2,1] ) # 3行、2列め print( arr2[:,0] ) # 第1列 print( arr3[0,1,2] ) # 最初の3x3 の行列の2行3列め print( arr3[:,0,:] ) # 行列になる }}~ ~ ※ コメント~ ・ 3次元配列に、ひとつでも浮動小数点のデータをがあると、全体が float64 に~ ・ 3次元配列で、arr3[:,0,:] では、2つの「2次元配列の1行目」からなる行列に~ ~ - 配列に対する操作~ #code(python){{ # 配列の要素の合計 print(np.sum(arr1)) print(np.sum(arr2)) print(np.sum(arr3)) # 配列の最大値と最小値 print(np.max(arr1)) print(np.max(arr2)) print(np.max(arr3)) print(np.min(arr1)) print(np.min(arr2)) print(np.min(arr3)) # 配列の平均値と中央値 print(np.mean(arr1)) print(np.mean(arr2)) print(np.mean(arr3)) print(np.median(arr1)) print(np.median(arr2)) print(np.median(arr3)) # 配列の転置 print(arr2.T) print(arr3.T) # 配列の要素の順番を反転 print(np.flip(arr1)) print(np.flip(arr2, axis=0)) print(np.flip(arr2, axis=1)) print(np.flip(arr3, axis=0)) print(np.flip(arr3, axis=1)) print(np.flip(arr3, axis=2)) }}~ ※ コメント~ ・ 2次元の配列の転置は普通の意味の転置。~ ・ 3次元の配列の転置は第1引数と第3引数が入れ替わる。~ 例: arry3[0,2,1] と arr3.T[1,2,0] とが同じ。~ ・ flip については、試してみるとわかる。 ~ - 以下、未完。 更に付け加えることは? #code(python){{ import numpy as np # 等間隔の数値からなる配列の生成 arr3 = np.linspace(0, 10, 5) print(arr3) # ゼロ行列の生成 zeros = np.zeros((3, 3)) print(zeros) # 1で埋められた行列の生成 ones = np.ones((2, 4)) print(ones) # 特定の値で埋められた行列の生成 filled = np.full((3, 3), 7) print(filled) # ランダムな値で埋められた行列の生成 random = np.random.random((2, 2)) print(random) # 行列の要素ごとの足し算 a = np.array([[1, 2], [3, 4]]) b = np.array([[5, 6], [7, 8]]) result = a + b print(result) # 行列の要素ごとの掛け算 result = a * b print(result) # 行列の積の計算 result = np.dot(a, b) print(result) # 行列の転置 print(a.T) # 行列の要素の合計(行または列ごと) print(np.sum(a, axis=0)) # 列ごとの合計 print(np.sum(a, axis=1)) # 行ごとの合計 # 行列の要素の平均(行または列ごと) print(np.mean(a, axis=0)) # 列ごとの平均 print(np.mean(a, axis=1)) # 行ごとの平均 }} 更に例を追加して #code(python){{ import numpy as np # 条件を満たす要素の抽出 arr4 = np.array([1, 2, 3, 4, 5]) even_nums = arr4[arr4 % 2 == 0] print(even_nums) # 配列の要素の並び替え arr5 = np.array([3, 1, 4, 2, 5]) sorted_arr5 = np.sort(arr5) print(sorted_arr5) # 行列の結合 matrix1 = np.array([[1, 2], [3, 4]]) matrix2 = np.array([[5, 6], [7, 8]]) concatenated = np.concatenate((matrix1, matrix2), axis=0) print(concatenated) # 行列の分割 split_arr = np.array([1, 2, 3, 4, 5, 6]) split_parts = np.split(split_arr, 3) print(split_parts) # 行列の形状の変更 reshape_arr = np.array([1, 2, 3, 4, 5, 6]) reshaped = np.reshape(reshape_arr, (2, 3)) print(reshaped) # 行列の要素の重複の削除 arr6 = np.array([1, 2, 2, 3, 3, 3, 4, 4, 4, 4]) unique_vals = np.unique(arr6) print(unique_vals) # 行列の要素のインデックスの取得 arr7 = np.array([10, 20, 30, 40, 50]) index = np.where(arr7 == 30) print(index) # 行列の要素の統計情報 arr8 = np.array([[1, 2, 3], [4, 5, 6]]) print(np.min(arr8, axis=1)) # 行ごとの最小値 print(np.max(arr8, axis=0)) # 列ごとの最大値 print(np.mean(arr8, axis=1)) # 行ごとの平均値 print(np.std(arr8, axis=0)) # 列ごとの標準偏差 }} 特に、気象レーダーのデータを扱うときに重要と思われる例は? ++ レーダー画像の可視化と表示: numpy を使用して、レーダーデータを可視化し、画像として表示する方法が重要です。以下は、matplotlibライブラリを使用してレーダーデータを表示する例です。 #code(python){{ import numpy as np import matplotlib.pyplot as plt # レーダーデータの読み込み radar_data = np.loadtxt("radar_data.txt") # データの可視化と表示 plt.imshow(radar_data, cmap="rainbow") plt.colorbar() plt.show() }} ++ レーダーデータのフィルタリング: レーダーデータにはノイズや不要な信号が含まれることがあります。numpy を使用して、レーダーデータをフィルタリングすることで、ノイズを除去し、よりクリアな情報を抽出することができます。 #code(python){{ import numpy as np from scipy.ndimage import gaussian_filter # レーダーデータの読み込み radar_data = np.loadtxt("radar_data.txt") # ガウシアンフィルタを使用したデータの平滑化 smoothed_data = gaussian_filter(radar_data, sigma=2) # データの可視化と表示 plt.imshow(smoothed_data, cmap="rainbow") plt.colorbar() plt.show() }} ++ レーダーデータの統計情報の計算: レーダーデータから統計情報を計算することは、気象解析や予測において重要です。numpy を使用して、最大値、最小値、平均値、標準偏差などの統計情報を計算することができます。 #code(python){{ import numpy as np # レーダーデータの読み込み radar_data = np.loadtxt("radar_data.txt") # 最大値、最小値、平均値、標準偏差の計算 max_value = np.max(radar_data) min_value = np.min(radar_data) mean_value = np.mean(radar_data) std_value = np.std(radar_data) print("Max Value:", max_value) print("Min Value:", min_value) print("Mean Value:", mean_value) print("Standard Deviation:", std_value) }}