scipy-best-practices について
SciPy を使った科学計算の Python 開発指針をまとめたスキルです。最適化、数値計算、統計、補間、信号処理、疎行列、テストを扱います。
主な機能
- 01最適化手法の選択指針
- 02線形代数と疎行列ソルバー
- 03統計と補間の指針
- 04積分と信号処理の手法
- 05数値検証とテスト
活用シーン
- 01数値問題に適した最適化手法の選定
- 02大規模な疎線形システムの求解
- 03信号や統計データの分析
- 04既知の結果を用いた科学計算のテスト
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ mindrally/ skills --skill scipy-best-practicesインストール後、Claude Code で/scipy-best-practicesを入力して読み込まれたか確認します。
詳細
SciPy のベストプラクティス
科学計算、最適化、信号処理、統計解析を中心とした、SciPy 開発のための専門的なガイドラインです。
コードスタイルと構成
- 正確な SciPy の例を用いて、簡潔で技術的な Python コードを記述します
- 数値精度と計算効率を優先します
- 数学演算には関数型プログラミングのパターンを使用します
- 明示的なループよりベクトル化演算を優先します
- 科学的な文脈を反映した、わかりやすい変数名を使用します
- PEP 8 のスタイルガイドラインに従います
scipy.optimize - 最適化
- 汎用的な最適化には
scipy.optimize.minimize()を使用します - 問題の特性に応じて適切な手法を選択します:
'BFGS'は滑らかで制約のない問題に使用します'L-BFGS-B'は境界付きの問題に使用します'SLSQP'は制約付き最適化に使用します'Nelder-Mead'は微分不可能な関数に使用します
- 利用可能な場合は勾配を指定して、収束を速めます
- 非線形最小二乗フィッティングには
scipy.optimize.curve_fit()を使用します - 方程式の根を求めるには
scipy.optimize.root()を使用します
scipy.linalg - 線形代数
- 追加機能を利用するため、
numpy.linalgよりscipy.linalgを優先します - 行列の逆行列を計算する代わりに
scipy.linalg.solve()を使用します - 構造化行列(帯行列、三角行列)には専用のソルバーを活用します
- 右辺が複数ある場合は
scipy.linalg.lu_factor()とlu_solve()を使用します - 大規模な疎行列システムには
scipy.sparse.linalgの疎行列ソルバーを使用します
scipy.stats - 統計
- 確率計算には分布オブジェクトを使用します
- 要約統計量には
scipy.stats.describe()を活用します - 仮説検定関数
ttest_ind()、chi2_contingency()、mannwhitneyu()を使用します - 分布の
.rvs()メソッドでランダムサンプルを生成します - データからパラメーターを推定するには
.fit()を使用します
scipy.interpolate - 補間
- 1 次元補間には
scipy.interpolate.interp1d()を使用します - 散在データの補間には
scipy.interpolate.griddata()を使用します - 適切な補間方法
'linear'、'cubic'、'nearest'を選択します - 滑らかな補間にはスプライン関数
UnivariateSpline、BSplineを使用します - 規則格子データには
RegularGridInterpolatorの使用を検討します
scipy.integrate - 積分
- 単積分には
scipy.integrate.quad()を使用します - 多重積分には
scipy.integrate.dblquad()、tplquad()を使用します - 常微分方程式には
scipy.integrate.solve_ivp()を使用します - 適切な ODE 手法
'RK45'、'BDF'、'LSODA'を選択します - スティッフなシステムでは、パフォーマンス向上のためヤコビアンを指定します
scipy.signal - 信号処理
- フィルター設計には
scipy.signal.butter()、cheby1()、ellip()を使用します - ゼロ位相フィルタリングには
scipy.signal.filtfilt()でフィルターを適用します - パワースペクトル密度の推定には
scipy.signal.welch()を使用します - ピーク検出には
scipy.signal.find_peaks()を使用します - 畳み込みには
scipy.signal.convolve()とcorrelate()を活用します
scipy.sparse - 疎行列
- 用途に適した疎行列形式を使用します:
csr_matrixは効率的な行スライスと行列ベクトル積に使用しますcsc_matrixは効率的な列スライスに使用しますcoo_matrixは疎行列の構築に使用しますlil_matrixは逐次的な構築に使用します
- 演算の前に最適な形式へ変換します
- 疎線形システムには
scipy.sparse.linalgのソルバーを使用します
パフォーマンスの最適化
- 適切なデータ型を使用します(精度には
float64、メモリー効率にはfloat32) - 最適化された線形代数処理には、SciPy 経由で BLAS/LAPACK を活用します
- 可能な場合は配列を事前に確保します
- 利用可能な場合はインプレース演算を使用します
エラー処理と検証
- 最適化ルーチンの収束ステータスを確認します
- 数値結果が妥当であることを検証します
- 悪条件の問題を適切に処理します
- 収束判定には適切な許容誤差を使用します
科学計算コードのテスト
- 既知の解析解を使ってテストします
- 数値比較には
np.testing.assert_allclose()を使用します - エッジケースと境界条件をテストします
- 保存則と不変量を検証します
主な規約
- 特定のサブモジュールをインポートします:
from scipy import optimize, stats, linalg - 変数名と関数名には
snake_caseを使用します - アルゴリズムの選択理由とパラメーターを記載します
- 出力に収束診断を含めます
コメント
Markdown 対応