NumPy の再現可能なベストリサーチ vs R: トップピックの比較 (2026)
NumPy と R の再現性についてですが、どちらのエコシステムでもデフォルトでは再現性は確保されていません。これは、NumPy のランダムな状態、BLAS スレッド、および浮動小数点の合計順序がすべて実行ごとの変動を引き起こすためです。一方、R のデフォルトの sample() の動作はバージョン 3.6.0 で変更されました。これはまさに、変更された RNG では以前の動作が再現できなかったためです。どちらも、適切に実践すれば厳密に再現可能になります。異なるのは、失敗パターンがどこに存在するか、そしてどの程度の摩擦が発生するかです。
この記事では、分子動力学、量子化学、バイオインフォマティクス パイプライン、大規模配列解析など、シミュレーションを多用する作業の再現性プラットフォームとして 2 つのエコシステムを比較し、勝者を宣言するのではなく、意思決定の枠組みを提供します。現在 NumPy/HDF5 パイプラインを実行していて、R を使用すべきだったかどうか (またはその逆) を疑問に思っている場合は、このガイドが役立ちます。
重要なポイント
- NumPy もベース R もそのままでは再現できません。 NumPy のデフォルトのランダム状態、BLAS スレッド、および浮動小数点加算順序はすべて、実行ごとの変動の原因です。同様に、R のデフォルトの
sample()動作はバージョン 3.6.0 で変更されました。これは、変更された RNG では以前の動作が再現できなかったためです。 - R のパッケージ エコシステム (renv、targets、R Markdown/Quarto) は、統計分析とレポート作成のためのより多くのターンキー再現性ツールを提供します。 Python のツール (conda-lock、uv、Snakemake、DVC、コンテナ化) は、任意の計算とハイ パフォーマンス コンピューティング (HPC) に対してより成熟しています。
- NumPy 作業における主な再現性リスクは、言語そのものではなく、数値環境 (BLAS/LAPACK ビルド、スレッド数、CPU 命令セット) です。 R では、パッケージ バージョンのドリフト や RNG のデフォルトによってリスクが発生することが多くなります。
- シミュレーションや配列を多用するサイエンスには、通常、NumPy/Python が適しています。統計モデリング、表形式データ、および正確なレポートの場合、通常は R が勝ちます。混合パイプラインは一般的であり、正当です。
- できることはすべてピン留めし、できないことはすべて記録します。
sessionInfo()またはnumpy.show_config()ダンプをロックファイルとコンテナと組み合わせることで、どちらの言語でも必要な保証の大部分が提供されます。
本当の質問: 非決定論はどこに入るのか?
エコシステムを比較する前に、混同されることが多い次の 2 つの目標を区別することが重要です。
- 再実行可能性: 他の人がコードを実行して a 結果を得ることができます。
- ビットごとの再現性: 他の誰かが最後のビットに至るまで まったく同じ数値 を取得します。
出版された科学のほとんどは (1) を必要とし、可能な場合は (2) から恩恵を受けます。 2 つの言語は、それぞれの達成の難易度が異なります。
NumPy の非決定性のソース
- 乱数の生成。
numpy.random(従来のRandomState) と新しいGeneratorAPI の間には違いがあります。 「Generator」はデフォルトで PCG64 を使用し、これが推奨パスです。 「RandomState」は下位互換性のために凍結されています。明示的なシードと記録がなければ、再現性は不可能です。 - BLAS/LAPACK バックエンド。 NumPy は、行列演算を、それが構築された BLAS ライブラリ (OpenBLAS、MKL、BLIS、または Apple Accelerate など) に委任します。異なるバックエンド (または同じバックエンドの異なるビルド) では、加算順序とベクトル化が異なるため、異なる浮動小数点結果が生成される可能性があります。
- スレッド化。 マルチスレッド BLAS は、スレッド数とスケジュールに基づいて削減順序を変更できます。
OMP_NUM_THREADS=1およびOPENBLAS_NUM_THREADS=1を設定することは、パフォーマンスが犠牲になりますが、結果を安定させる一般的な方法です。 - CPU 命令セット。 AVX-512、AVX2、およびスカラー パスの違いにより、超越関数の丸めが異なる場合があります。これは、「ラップトップでは動作しました」が数値コードでよくある問題である理由を説明しています。
- ライブラリのバージョン。 NumPy、SciPy、pandas、および HDF5 は、バージョン間で数値の動作を変更することができます。 HDF5 ファイルの互換性は一般に強力ですが、基礎となる計算が変更された場合、書き込まれる 値 が異なる場合があります。
R の非決定性のソース
- RNG のデフォルト。 R はバージョン 3.6.0 でデフォルトのサンプリング方法 (具体的には
sample()の「拒否」サンプリング) を変更し、シードを設定しなかったコードや従来の動作に依存したコードの結果を変更しました。これは、言語レベルの再現性が損なわれる典型的な例です。 - パッケージ バージョンのドリフト。 CRAN パッケージは頻繁に更新されます。
lme4バージョン X に適合するモデルは、バージョン Y に適合しない可能性があります。renvは、これを解決するために特別に作成されました。 - 浮動小数点と BLAS。 R は BLAS/LAPACK にもリンクします。つまり、R のコア数値ルーチンはより集中化されていますが、同じバックエンドの問題が適用されます。
- 並列バックエンド。
parallel、future、およびforeachなどのパッケージは、シードが慎重に処理されない場合、スケジューリングに依存した結果を引き起こす可能性があります (たとえば、future.applyにはこの理由から明示的なシード処理が含まれています)。
要点: NumPy の再現性の課題は主に環境と数値に関するものですが、R は主にパッケージのバージョンと RNG 規約に関連しています。
比較表: 再現性ツール
| 懸念事項 | NumPy / Python エコシステム | Rエコシステム |
|---|---|---|
| 環境の固定 | conda-lock、uv、pip-tools、詩 | pak, renv |
| コンテナ化 | Docker、Apptainer/Singularity (HPC) | Docker、Apptainer/Singularity |
| ワークフロー オーケストレーション | Snakemake、Nextflow、DVC、Prefect | targets、Makefile |
| リテラシーのあるレポート | Jupyter、Quarto、Jupytext | R マークダウン、Quarto、knitr |
| RNG制御 | np.random.default_rng(シード)、SeedSequence | set.seed()、withr::with_seed() |
| 環境記録 | numpy.show_config()、pip freeze | sessionInfo()、renv::snapshot() |
| 数値バックエンド制御 | OMP_NUM_THREADS、MKL 設定 | RhpcBLASctl、OMP_NUM_THREADS |
| HPC 統合 | 強力 (mpi4py 経由の MPI、Apptainer) | 中程度 (Rmpi、future、batchtools) |
| データのシリアル化 | HDF5 (h5py)、Zarr, Parquet、NPZ | RDS、フェザー/アロー、rhdf5 経由の HDF5 |
再現可能なシミュレーションで NumPy が勝てる場所
分子動力学の後処理、スペクトル解析、または大規模配列パイプラインの場合、NumPy/Python には構造上の利点があります。
関連: — ガイド付きターミナルと実際のデータセットを使用したプロジェクトベースのデータ サイエンス パス.
- 標準としてのコンテナ化 HPC センターは Apptainer イメージを頻繁に使用し、Python 科学スタックは日常的にコンテナ化されています。 BLAS ビルドを含む数値環境全体をイメージにフリーズすることで、同じ CPU を搭載したマシン間でビット同一の結果を得ることができます。
- パイプライン指向のワークフロー エンジン。 Snakemake と Nextflow は、シミュレーション解析に典型的なマルチステージのファイルイン/ファイルアウト計算用に設計されました。これらは、来歴、部分的な再実行、クラスターの送信の処理に優れています。
- 慣用的な RNG コントロール。 「Generator」/「SeedSequence」設計により、並列作業用に独立した再現可能なストリームを自然に生成できます。これは、何千もの独立したシミュレーション レプリカを実行する場合に重要です。
- ファーストクラスの HDF5 および Zarr のサポート。 メモリ容量を超える配列データの場合、Python エコシステムのシリアル化はより標準化され、堅牢になります。
numpy.show_config()によるバックエンド監査。 ビルドで使用された BLAS バージョンと SIMD フラグを正確に記録し、数値の再現性に必要な環境の透明性を提供します。
コスト: 環境を積極的に管理する必要があります。単純な pip install numpy は、プラットフォームに一致するホイールを提供しますが、そのホイールの BLAS はコラボレーターの BLAS とは異なる場合があります。
再現可能な分析で R が勝てる場所
R の強みは、シミュレーションのみに焦点を当てている人によって過小評価されることがよくあります。
renvを使用したターンキー依存関係ロック。renv::init()に続いてrenv::snapshot()を実行すると、ロックファイルとプロジェクト ローカル ライブラリが作成されます。これを別のマシンに復元するには、1 つのコマンドを実行します。targetsを使用した再現性優先のパイプライン。targetsは関数レベルで依存関係を追跡し、変更されていない作業をスキップします。統計分析の場合、多くの場合、Snakemake よりもクリーンです。- ネイティブのリテレート分析。 R Markdown と Quarto は、コードと散文を単一の再現可能なドキュメントに統合します。 Jupyter + Quarto は Python 用に存在しますが、R コミュニティは「出版物としてのノートブック」を標準として扱います。
- ワンコール環境記録。
sessionInfo()は、R バージョン、プラットフォーム、およびロードされたすべてのパッケージ バージョンをキャプチャし、標準の「再現性レシート」として機能します。 - 標準的な統計手法。 混合効果モデルまたは生存分析の場合、リファレンス実装は通常 R です。Python でこれらを一致させるには、再実装またはポートの信頼が必要になることがよくあります。
コスト: R は、任意の数値計算、大規模な配列作業、および HPC オーケストレーションに対して効率が低くなります。
一見の価値があります: — 大学が支援する Python およびデータサイエンス証明書の 1 つのサブスクリプション.
正直な評決: 通常はどちらか一方ではない
最も再現性の高いラボでは 両方 を使用することが多いため、「NumPy と R」の枠組みは若干誤解を招きます。
- Python による大量のシミュレーションと配列処理。Snakemake でコンテナ化およびオーケストレーションされます。
- 統計モデリングと最終レポート用の R。「renv」でロックされ、Quarto でレンダリングされます。
- 中立形式 (Parquet、Arrow、または HDF5) の間でデータを交換します。
規律は同じままです: 依存関係を固定し、RNG をシードし、環境を記録し、数値スタックをコンテナ化し、パイプライン定義をバージョン管理します。
実用的な再現性チェックリスト (言語に依存しない)
- すべての RNG を明示的にシードし、出力メタデータにシードを記録します。 (NumPy:
default_rng(seed); R:set.seed())。 - 数値バックエンドを固定します。 BLAS/LAPACK プロバイダーとバージョンを記録します。一致する必要がある結果に対してスレッド数を明示的に設定します。
- 依存関係をロックします。 R には
renvを使用します。 Python の場合は「conda-lock」または「uv」。ロックファイルをバージョン管理にコミットします。 - 実行ごとに 環境を記録:
sessionInfo()またはnumpy.show_config()に加えてpipfreeze/conda list --explicitを実行します。 - 公開または引き渡しを目的とした作業 (特に HPC) については、フルスタックをコンテナ化します。
- スクリプトだけでなく、パイプラインのバージョンを管理します。 Snakemake、Nextflow、または「targets」定義は Git に属します。
- 再現性をテストするには、2 番目のマシンまたは新しいコンテナでコードを実行し、出力を比較します。
- 制御不可能な変数 (CPU アーキテクチャや GPU ドライバーなど) を文書化して、読者が再現性の限界を理解できるようにします。
プロジェクトの決定方法
次の質問を順番に尋ねてください。
- コアの計算は配列が多いですか?それともシミュレーション ベースですか? $\rightarrow$ NumPy/Python。
- コアの計算は表形式データの統計モデリングですか? $\rightarrow$ R.
- HPC オーケストレーションとコンテナ化が主な関心事として必要ですか? $\rightarrow$ Python。
- ロックされた依存関係を備えた、出版可能な読み書き可能なドキュメントが必要ですか? $\rightarrow$ R +
renv+ Quarto。 - 参照統計実装と一致させる必要がありますか? $\rightarrow$ R.
- 参照数値/シミュレーション実装と一致させる必要がありますか? $\rightarrow$ Python。
Python と R の両方の質問に「はい」と答えた場合は、2 言語のパイプラインを構築します。各ステージでは、その特定のタスクに対して最も強力な保証を備えたツールが使用されるため、多くの場合、これが最も再現可能な設計になります。
出典と詳細情報
- NumPy — Wikipedia: NumPy (NUM-pyと発音) は、Python プログラミング言語のライブラリであり、大規模な多次元配列と行列のサポートを追加します。
よくある質問
NumPy は R よりも再現性が高いですか?
どちらもデフォルトでは再現できません。 NumPy のリスクは主に環境 (BLAS、スレッド、CPU 命令) ですが、R のリスクは主にパッケージのバージョンと RNG のデフォルトに関連しています。適切なシードとコンテナ化により、どちらも高い再現性が得られます。
R には Python より優れた再現性ツールがありますか?
依存関係のロックと読み書き可能なレポートに関しては、R の renv と Quarto ワークフローの方がより簡単です。コンテナ化と HPC オーケストレーションに関しては、Python エコシステムの方がより成熟しています。
NumPy シミュレーションを再現可能にするにはどうすればよいですか?
numpy.random.default_rng(seed) で RNG をシードし、シードを記録し、ロックファイルにバージョンを固定し、numpy.show_config() を記録し、OMP_NUM_THREADS と OPENBLAS_NUM_THREADS を明示的に設定し、環境をコンテナ化します。
R の結果がバージョン間で異なるのはなぜですか?
R はバージョン 3.6.0 でデフォルトの sample() の動作を変更しました。さらに、CRAN パッケージの更新により、モデルの調整や数値ルーチンが変更される場合があります。 「renv」と明示的なシードを使用すると、これらの問題のほとんどが回避されます。
NumPy と R の両方を 1 つの再現可能なパイプラインで使用できますか?
はい。一般的なパターンは、シミュレーションに Python を使用し、統計モデリングに R を使用し、Parquet、Arrow、または HDF5 を介してデータを交換することです。重要なのは、両方のエコシステムの依存関係をロックすることです。
最も重要な再現性の実践は何ですか?
すべての結果とともに、完全な環境 (言語バージョン、パッケージ バージョン、数値バックエンド、RNG シード) を記録します。この記録がないと、決定論的計算は別のマシンで実行された瞬間に再現できなくなります。
よくある質問
NumPy は R よりも再現性が高いですか?
どちらもデフォルトでは再現できません。 NumPy のリスクは主に環境 (BLAS、スレッド、CPU 命令) ですが、R のリスクは主にパッケージのバージョンと RNG のデフォルトに関連しています。適切なシードとコンテナ化により、どちらも高い再現性が得られます。
R には Python よりも優れた再現性ツールがありますか?
依存関係のロックと読み書き可能なレポートに関しては、R の renv および Quarto ワークフローの方がよりターンキーです。コンテナ化と HPC オーケストレーションに関しては、Python エコシステムの方がより成熟しています。
NumPy シミュレーションを再現可能にするにはどうすればよいですか?
numpy.random.default_rng(seed) で RNG をシードし、シードを記録し、ロックファイルにバージョンを固定し、numpy.show_config() を記録し、OMP_NUM_THREADS と OPENBLAS_NUM_THREADS を明示的に設定し、環境をコンテナ化します。
R の結果がバージョン間で異なるのはなぜですか?
R は、バージョン 3.6.0 でデフォルトのsample() 動作を変更しました。さらに、CRAN パッケージの更新により、モデルの調整や数値ルーチンが変更される場合があります。 renv と明示的なシードを使用すると、これらの問題のほとんどが回避されます。
NumPy と R の両方を 1 つの再現可能なパイプラインで使用できますか?
はい。一般的なパターンは、シミュレーションに Python を使用し、統計モデリングに R を使用し、Parquet、Arrow、または HDF5 を介してデータを交換することです。重要なのは、両方のエコシステムの依存関係をロックすることです。
最も重要な再現性の実践は何ですか?
すべての結果とともに、完全な環境 (言語バージョン、パッケージ バージョン、数値バックエンド、RNG シード) を記録します。この記録がないと、決定論的計算は別のマシンで実行された瞬間に再現できなくなります。
ブラウザでコーディングして Python を学習する
ブラウザーで直接コーディングするインタラクティブな Python およびデータ サイエンス コース