前提・実現したいこと
二次元のxy座標に分布する流速VxとVyをCSVファイルから読み込み、最終的には流速から圧力を求める式につなげたいと考えております
まずは各座標(i,j)での流速データVx(i,j)、Vy(i,j)の中心差分を求めるため、任意の座標ごとのx方向に隣り合う座標の流速データVx(i+1,j)、Vx(i-1,j)を求めようとしましたが、うまく取得できません
解決した際は各xy方向での流速の差
Vx(i+1,j)-Vx(i-1,j)
Vy(i+1,j)-Vy(i-1,j)
Vx(i,j+1)-Vx(i,j-1)
Vy(i,j+1)-Vy(i,j-1)
を求める予定です
取得データ(計算格子)の間隔が画像座標で16pxであるため、実際にx方向で隣り合う座標は(i+16,j)と(i-16,j)、y方向では(i,j+16)と(i,j-16)となります
ご教授いただければ幸いです
発生している問題・エラーメッセージ
データの形は以下の通りです
csvファイルの流速データをpd.read_csvで読み込みました
import pandas as pd df1 = pd.read_csv("./data/30deg_10x10plate_10f.csv", skiprows=2, usecols=[0, 1, 2, 3, 6, 7, 8], names=['Pair', 'Num', 'X_px', 'Y_px', 'Vx_mm/s', 'Vy_mm/s', 'V_mm/s'])
下記が出力されます
Pair Num X_px Y_px Vx_mm/s Vy_mm/s V_mm/s 0 Pair01 2 16 0 0.0 0.0 0.0 1 Pair01 3 32 0 0.0 0.0 0.0 2 Pair01 4 48 0 0.0 0.0 0.0 3 Pair01 5 64 0 0.0 0.0 0.0 4 Pair01 6 80 0 0.0 0.0 0.0 ... ... ... ... ... ... ... ... 110394 Pair10 11036 1840 1456 0.0 0.0 0.0 110395 Pair10 11037 1856 1456 0.0 0.0 0.0 110396 Pair10 11038 1872 1456 0.0 0.0 0.0 110397 Pair10 11039 1888 1456 0.0 0.0 0.0 110398 Pair10 11040 1904 1456 0.0 0.0 0.0 [110399 rows x 7 columns]
Pairはシチュエーションの数、Numは計算格子点の番号、X_px,Y_pxはピクセル単位での座標、Vx_mm/s Vy_mm/s V_mm/sはx方向の流速、y方向の流速、xy方向の流速(流速ベクトルの長さ)になります
該当のソースコード
Python
1# %% environment settings 2import pandas as pd 3df1 = pd.read_csv("./data/30deg_10x10plate_10f.csv", skiprows=2, usecols=[0, 1, 2, 3, 6, 7, 8], 4 names=['Pair', 'Num', 'X_px', 'Y_px', 'Vx_mm/s', 'Vy_mm/s', 'V_mm/s']) 5print(df1) 6# 各座標での(x±16,y)と(x,y±16)の流速データを並べればいい? 7df1['X_px+16'] = df1['X_px'] + 16 8df1['Y_px+16'] = df1['Y_px'] + 16 9df1['X_px-16'] = df1['X_px'] - 16 10df1['Y_px-16'] = df1['Y_px'] - 16 11df1['X_px_2'] = df1['X_px'] 12df1['Y_px_2'] = df1['Y_px'] 13df1['X_px_2'] = df1['X_px'] 14df1['Y_px_2'] = df1['Y_px'] 15df1['Vx_xpx+16'] = df1['Vx_mm/s'].loc[(df1['X_px'] == df1['X_px+16']) & (df1['Y_px'] == df1['Y_px_2'])] 16df1['Vx_xpx-16'] = df1['Vx_mm/s'].loc[(df1['X_px'] == df1['X_px-16']) & (df1['Y_px'] == df1['Y_px_2'])] 17df1['Vx_ypx+16'] = df1['Vx_mm/s'].loc[(df1['Y_px'] == df1['Y_px+16']) & (df1['X_px'] == df1['X_px_2'])] 18df1['Vx_ypx-16'] = df1['Vx_mm/s'].loc[(df1['Y_px'] == df1['Y_px-16']) & (df1['X_px'] == df1['X_px_2'])] 19df1['Vy_xpx+16'] = df1['Vy_mm/s'].loc[(df1['X_px'] == df1['X_px+16']) & (df1['Y_px'] == df1['Y_px_2'])] 20df1['Vy_xpx-16'] = df1['Vy_mm/s'].loc[(df1['X_px'] == df1['X_px-16']) & (df1['Y_px'] == df1['Y_px_2'])] 21df1['Vy_ypx+16'] = df1['Vy_mm/s'].loc[(df1['Y_px'] == df1['Y_px+16']) & (df1['X_px'] == df1['X_px_2'])] 22df1['Vy_ypx-16'] = df1['Vy_mm/s'].loc[(df1['Y_px'] == df1['Y_px-16']) & (df1['X_px'] == df1['X_px_2'])] 23 24print(df1) 25df1.to_csv(f"./output/vvv.csv")
試したこと
任意のxy座標に計算格子の間隔(±16px)と一致する座標の流速データの行を追加しようとしましたが、すべて空欄で出力されました
また複数の状況(Pair1-10)が混在しているせいかと考え
df1 = df1.groupby('Pair')
を追加してみましたが、
Traceback (most recent call last): File "C:/Users/ユーザー名/Pressure/Predict_pressure_from_velocity.py", line 17, in <module> df1['Vx_xpx+16'] = df1['Vx_mm/s'].loc[(df1['X_px'] == df1['X_px+16']) & (df1['Y_px'] == df1['Y_px_2'])] File "C:\Users\ユーザー名\anaconda3\envs\PIVcalc\lib\site-packages\pandas\core\groupby\groupby.py", line 752, in __getattr__ raise AttributeError( AttributeError: 'SeriesGroupBy' object has no attribute 'loc'
となりました
そもそもpandasでやろうとしていること自体が間違いで、numpyで処理すべきなのでしょうか?
まだ独学でPythonに触れ始めてから日が浅く、何か根本的な部分で致命的に間違えているように思えてなりません
ご教授いただければ幸いです
よろしくお願いいたします
補足情報(FW/ツールのバージョンなど)
Python3.8
Anaconda3
PyCharm 2021.1.2 (Community Edition)
回答1件
あなたの回答
tips
プレビュー