前の値で補間(Interpolation)

Extending array by repeating values if another array is not continues – StackOverflow

「pandas.DataFrame.ffill()(pandas.DataFrame.fillna(method=’ffill’))」が
一般的な方法だが,numpyでは今までこの機能がありそうでなかった.
その為,numpyソリューションが欲しい場合,回答の様に自分で実装する必要があった.

import numpy as np


def intrp_arrs(x, y, frame):
  frame = np.asarray(frame)
  x = np.asarray(x)
  y = np.asarray(y)
  
  l = frame[-1]-frame[0] + 1
  id_arr = np.zeros((l,), dtype=int)
  id_arr[frame-frame[0]] = 1
  idx = id_arr.cumsum() - 1
  return np.arange(frame[0], frame[-1]+1), x[idx], y[idx]


x = [80.1, 80.2, 80.1, 80.2, 80.3]
y = [40.1, 40.2, 40.1, 40.2, 40.3]
frame = [1, 2, 3, 4, 6]
intrp_arrs(x, y, frame)
(array([1, 2, 3, 4, 5, 6]),
 array([80.1, 80.2, 80.1, 80.2, 80.2, 80.3]),
 array([40.1, 40.2, 40.1, 40.2, 40.2, 40.3]))

でも,SciPyの1.1.0では(多分,1.0.0の時はまだ無かった),
「scipy.interpolate.interp1d」でffillやbfillと同じ事ができる様になった.

import numpy as np
from scipy.interpolate import interp1d


def interp_pre_vals(frame, *args):
  def f(x):    return interp1d(frame, x, kind='previous')(reframe)

  reframe = np.arange(frame[0], frame[-1]+1)
  return (reframe, *[f(arr) for arr in args])


x = [80.1, 80.2, 80.1, 80.2, 80.3]
y = [40.1, 40.2, 40.1, 40.2, 40.3]
frame = [1, 2, 3, 4, 6]
interp_pre_vals(frame, x, y)
(array([1, 2, 3, 4, 5, 6]),
 array([80.1, 80.2, 80.1, 80.2, 80.2, 80.3]),
 array([40.1, 40.2, 40.1, 40.2, 40.2, 40.3]))

約10倍,時間効率が違うし,
pandasと比べても3倍程効率が悪いので,
リーズナブルな方法ではないけど.

ゴリゴリに数値計算をする場合を除いて,データ処理に於いては,
何だかんだ,Pandasがリーズナブルチョイスだと感じる.

カテゴリー: 未分類 パーマリンク

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google フォト

Google アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください