【Python】数行で書ける点列の線形補間によるリサンプリング【コードアーカイブス】

二次元座標系で表現された点列の線形補間によるリサンプリングを効率的に行う方法を紹介します。

通常 リサンプリングを行う場合は、点列を結んだ線上に積算距離が一定の増加割合となるように内挿点を愚直に配置していく必要がありますが、Pythonのnumpyとpandasパッケージを使用することで、リサンプリング処理を数行で記述することが可能です。

入出力


(入力)

input_points

※numpy.adarray型としていますが、通常のリスト型でも同様の結果が得られます。

(出力)

output_points

必要パッケージ


  • numpy
  • pandas

解法


以下①~②の手順で、線形補間によるリサンプリングを行う

  1. 入力点列をpandasのDataFame型に変換する
  2. 「値域:[MIN(x), MAX(x)]」「公差:サンプリングレート」の点列を作成する
  3. ②の点列をpandasのDataFame型に変換する(カラム名は①のx座標と同じものとする
  4. ①と③のDataFameを「完全外部結合」によりマージする
  5. ④のDataFameを昇順でソートする(基準とするカラム:x座標
  6. ⑤のDataFameをDataFameのinterpolateメソッドで線形補完する(基準とするカラム:x座標
  7. ⑥と③のDataFameを「右結合」によりマージする

コード


Point1: 上記④⑤で二つのDataFrameを「完全外部結合」によりマージすることで、入力点列に含まれていないx座標値に対応するy座標値を一時欠損値とし、この状態で上記⑥のinterpolateメソッドを適用することで、欠損値を前後の値から線形補間することができます。
Point2: 上記⑦で二つのDataFrameを「右結合」によりマージすることで、上記②以外のx座標値を除外することができます。

※下記は上記のコードを関数化したものです。引数にx座標値、y座標値、サンプリングレートを渡すことで、リサンプリング後のx座標値、y座標値を得られます。

別解


scipyパッケージのinterpolate.interp1d関数の引数kindにlinearを指定すると、同様の結果が得られます。

特記事項


①線形補間によるリサンプリングのため、入力点列が曲線の場合は、リサンプリング後の点列は曲線とは完全には一致しません。

 

Pythonコードアーカイブス目次

 

 

広告