Pythonで配列を指定範囲を基準に3方向へ分割する方法
配列とその範囲 [startval, endval] が与えられたとき、配列を次の3つの部分に分割することを考えます。
- 第1部分:startval より小さいすべての要素(先頭に配置)
- 第2部分:startval 以上 endval 以下のすべての要素(中間に配置)
- 第3部分:endval より大きいすべての要素(末尾に配置)
この操作は「3方向パーティション」と呼ばれ、クイックソートの3ウェイ分割やデータの前処理など、さまざまな場面で応用される基本的なテクニックです。
実行例
入力: A = [1, 14, 51, 12, 4, 2, 54, 20, 87, 98, 3, 1, 32] startval = 14, endval = 54 出力: A = [1, 12, 4, 2, 3, 1, 14, 51, 54, 20, 32, 87, 98]
出力では、14 未満の要素(1, 12, 4, 2, 3, 1)が先頭に集まり、続いて 14〜54 の範囲内の要素(14, 51, 54, 20, 32)、最後に 54 より大きい要素(87, 98)が並びます。各グループ内では、元の配列での出現順序が保たれます。
アルゴリズム
ステップ1: リストを3つの部分に分割する。 第1部分 … startval 未満の要素 第2部分 … startval 以上 endval 以下の要素 第3部分 … endval より大きい要素 ステップ2: 3つの部分をこの順に連結する。
サンプルコード
def partition_array(input_list, low_val, high_val):
# 入力リストを3つの部分に分割する
first_part = [num for num in input_list if num < low_val]
second_part = [num for num in input_list if low_val <= num <= high_val]
third_part = [num for num in input_list if num > high_val]
# 3つの部分を連結して返す
return first_part + second_part + third_part
# ドライバプログラム
if __name__ == "__main__":
my_input = [10, 140, 50, 200, 40, 20, 540, 200, 870, 980, 30, 10, 320]
my_low_val = 140
my_high_val = 200
print(partition_array(my_input, my_low_val, my_high_val))
出力結果
[10, 50, 40, 20, 30, 10, 140, 200, 200, 540, 870, 980, 320]
コードの解説
この実装ではリスト内包表記を活用し、条件ごとに要素を抽出しています。1つ目の内包表記は low_val 未満の要素を、2つ目は low_val 以上 high_val 以下の要素を、3つ目は high_val を超える要素をそれぞれ収集します。最後に + 演算子で3つのリストを連結すれば、目的の順序で並んだ新しいリストが完成します。
計算量はリストを3回走査するため全体で O(n)、必要な追加メモリも O(n) です。また、各グループ内で元の順序が崩れない「安定な分割」になっている点も大きな特徴です。
-
【Python】NumPyのtrapz()で複合台形則により指定した軸に沿って数値積分する方法
指定した軸に沿って複合台形則(composite trapezoidal rule)による数値積分を実行するには、numpy.trapz() メソッドを使用します。x が指定された場合、積分はその要素の並び順に従って処理されます(要素が自動的にソートされることはありません)。このメソッドは、台形則によって単一の軸に沿って近似された n 次元配列 y の定積分を返します。y が1次元配列の場合、結果は float 型になります。次元数 n が1より大きい場合は、「n-1」次元の配列が返されます。主なパラメータ第1引数:y … 積分対象となる入力配列。第2引数:x … y の各値に対応するサンプル
-
Matplotlibを使ってPythonで配列をプロットする方法をわかりやすく解説
Pythonで配列データをグラフとして可視化したい場合、Matplotlibライブラリを使うのが最も一般的な方法です。本記事では、NumPyで作成した配列を折れ線グラフとして描画する基本的な手順を、実際のコード例とともに紹介します。 配列をプロットする基本の手順 Pythonで配列をプロットするには、以下の手順に従います。 図のサイズと余白の設定:figureサイズを指定し、サブプロット間および周囲のパディング(余白)を調整します。 配列の作成:numpyを使用して、xとyという2つの配列を作成します。 タイトルの設定:title()メソッドを使って、グラフにタイトルを付けます。 データ