NumPy データ分析の基礎: NumPy 機能の詳細な説明と Python の組み込みデータ構造の比較

目次

序文

まず、Numpy と Python の組み込み構造の違い

2. 運用性能比較

3. 基礎となるアーキテクチャ

注意してください、迷子にならないようにしてください。間違いがある場合は、メッセージを残してアドバイスをお願いします。どうもありがとうございました



序文

データ解析の三大巨頭、Pandas、matplotlib、NumPy の 1 つとして、顔については別途説明が必要です。NumPy アプリケーションのシナリオは非常に幅広く、多くの Pandas 関数が NumPy 配列データ構造に変換されます。機械学習、深層学習、および一部のデータ処理操作では、Pandas よりも頻繁に使用されます。さらに、NumPy は強力で使いやすく、さまざまな複雑な操作をサポートしています。私は通常、Pandas といくつかの機械学習の記事で NumPy を使用していますが、ブログ コンテンツでは NumPy の操作について詳しく説明しておらず、NumPy の操作に関する特定の関数の回答も記録していません。私のようなワンストップ サービスのニーズを追求するブロガーには本当に不適切なので、古いピットを埋めて、新しい 1 テキストの速度学習シリーズ - Numpy データ分析の基礎コラムを公開します。

この一連の記事は、私のコラム 1 である一連の高速学習 - NumPy データ分析基盤に含まれます。これは基本的に、NumPy データを使用して日常のビジネスとルーチンの数学的モデリング分析と複雑な操作を分析することをカバーしています。基本的な配列操作から、行列やベクトル機能の処理などの複雑な操作、およびプロの NumPy 共通関数まで、多くの時間と考えを費やして作成します. データ分析またはデータ開発に従事する必要がある場合, 数学的モデリング, 友達Python 工学の専門家がコラムを購読することをお勧めします. このブログは長いので、読んで実践する価値があります. 最良の部分を選んで、詳細に実践について話します. ブロガーはブログの投稿を長く続けますので、間違いや疑問点があればコメント欄で指摘していただけると助かります。


まず、Numpy と Python の組み込み構造の違い

以下を含む、Python で実装された科学計算:

1. 強力な N 次元配列オブジェクト Array;

2. 比較的成熟した関数ライブラリ。

3. C/C++ と Fortran コードを統合するためのツールキット。

4. 実用的な線形代数、フーリエ変換、乱数生成関数。

Numpy と疎行列演算パッケージの scipy を一緒に使用すると便利で、Pandas のデータ分析をより包括的に使用できます。NumPy は、Python で科学計算を行うための基本パッケージです。これは、多次元配列オブジェクト、さまざまな派生オブジェクト (マスクされた配列や行列など)、および数学、論理、形状操作、並べ替え、選択、I/O、離散フーリエ変換、基本的な線形代数、基本的な統計演算、確率シミュレーションなど

NumPy パッケージの中核は ndarray オブジェクトです。これにより、同種のデータ型の n 次元配列がカプセル化され、パフォーマンスを向上させるために、多くの操作がコンパイルされたコードで実行されます。NumPy 配列と標準の Python シーケンスの間には、いくつかの重要な違いがあります。

  • Python のリスト (動的に拡張できる) とは異なり、NumPy 配列は作成時のサイズが固定されています。標準配列のサイズを変更すると、新しい配列が作成され、元の配列が削除されます。
  • NumPy 配列の要素はすべて同じデータ型である必要があるため、同じメモリ サイズである必要があります。例外は、(NumPy を含む Python) オブジェクトの配列が存在する可能性があり、異なるサイズの要素の配列を許可することです。
  • NumPy 配列は、大量のデータに対する高度な数学およびその他のタイプの操作を容易にします。一般に、このような操作は、Python の組み込みシーケンスを使用するよりも効率的で少ないコードで実行されます。
  • ますます多くの Python ベースの科学および数学パッケージが NumPy 配列を使用しています; これらは一般に Python シーケンス入力をサポートしていますが、処理前にそのような入力を NumPy 配列に変換し、通常は NumPy 配列を出力します。言い換えれば、今日の Python ベースの科学/数学ソフトウェアの多く (またはほとんど) を効果的に使用するには、Python の組み込みシーケンス型の使用方法を知るだけでは十分ではなく、NumPy 配列の使用方法も知る必要があります。

2. 運用性能比較

科学計算では、シーケンスのサイズと速度が特に重要です。簡単な例として、1 次元シーケンスの各要素を、同じ長さの別のシーケンスの対​​応する要素と乗算する場合を考えてみましょう。データが 2 つの Python リスト a と b に格納されている場合、各要素を反復処理できます。

a=[1,2,3,4]
b=[5,6,7,8]
c = []
for i in range(len(a)):
    c.append(a[i]*b[i])

しかし、a と b の両方に何百万もの数値が含まれている場合、Python でのループは C ほど効率的ではありません。同じタスクは、次のように書くことでCでより速く実行できます(明確にするために、変数の宣言と初期化、メモリ割り当てなどを無視します)。

for (i = 0; i < rows; i++) {
  c[i] = a[i]*b[i];
}

 ただし、多次元配列がある場合は非常に複雑です。特に、多次元配列での集計操作は、コードの複雑さと時間の複雑さを大幅に増加させます。

for (i = 0; i < rows; i++) {
  for (j = 0; j < columns; j++) {
    c[i][j] = a[i][j]*b[i][j];
  }
}

しかし、NumPy は上記の 2 つの方法に基づいて最適化されており、その基になるコードは C 言語で記述されており、使用方法は非常に単純です。ndarray に関しては、要素単位の操作が「デフォルト モード」ですが、要素単位の操作です。コンパイル済みの C コードによって実行される クイック実行:

import numpy as np
a=np.array([1,2,3,4])
b=np.array([5,6,7,8])
c=a*b

 Python ベースのコードの単純さを使用して、前の例で行ったことをほぼ C の速度で実行します。NumPy の使用はさらに簡単です。最後の例は、その強力な機能の根底にある NumPy の 2 つの機能、ベクトル化とブロードキャストを示しています。

3. 基礎となるアーキテクチャ

ベクトル化は、コード内に明示的なループやインデックスなどが存在しないことを表します。これはもちろん、最適化されプリコンパイルされた C コードの「舞台裏」で発生します。ベクトル化されたコードには、次のような多くの利点があります。

  • ベクトル化されたコードはよりクリーンで読みやすくなっています
  • 通常、コード行が少ないということは、バグが少ないことを意味します
  • コードが標準の数学表記に近い (多くの場合、数学構造を正しくエンコードする方が簡単です)
  • ベクトル化により、より多くの "Pythonic" コードが生成されます。ベクトル化がなければ、コードは非効率的で読みにくいループでいっぱいになります。

ブロードキャストは、操作の暗黙的な要素ごとの動作を説明するために使用される用語です; 一般に、NumPy では、算術演算だけでなく、論理、ビット、関数などのすべての操作は、それらが動作する方法です。ブロードキャスト。また、上記の例では、a と b は、同じ形状の多次元配列、スカラーと配列、または異なる形状の 2 つの配列でさえありますが、小さい方の配列を大きい方の配列に「拡張」できる場合は、これにより、結果のブロードキャストが明確になります。ブロードキャストの詳細な「ルール」については、次を参照してください。

ブロードキャスト — NumPy v1.24.dev0 マニュアル
 

NumPy はオブジェクト指向のアプローチを完全にサポートしており、ndarray から始まります。たとえば、ndarray は多くのメソッドとプロパティを持つクラスです。そのメソッドの多くは、最も外側の NumPy 名前空間の関数によってミラーリングされているため、プログラマーは好きなパラダイムでコーディングできます。この柔軟性により、NumPy 配列の方言と NumPy-ndarray クラスが、Python で使用される多次元データ交換のデファクト言語になります。

注意してください、迷子にならないようにしてください。間違いがある場合は、メッセージを残してアドバイスをお願いします。どうもありがとうございました

この問題は以上です。ご不明な点がございましたら、お気軽にメッセージを残してください。次号でお会いしましょう


おすすめ

転載: blog.csdn.net/master_hunter/article/details/127118157