Pythonのリスト、配列、numpy.ndarrayの違いと使い分け

今回は、Pythonのリスト、配列、numpy.ndarrayの違いと使い分けについて、ご紹介しようと思います。

Pythonには、組み込み型としてリストlist、標準ライブラリに配列arrayが用意されています。

さらに数値計算ライブラリNumPyをインストールすると多次元配列numpy.ndarrayを使うこともできます。

それぞれの違いと使い分けについて説明します。

表で表現されるような二次元データを扱うのに便利な、データ分析ライブラリpandasについても最後に少し触れます。

リストと配列とnumpy.ndarrayの違い

リスト – list

  • 組み込み型
    • 何もimportせずに使える
  • 異なる型を格納できる
    • リストのリストによって多次元配列を表現することも可能
  • 厳密には配列と異なるが、配列ライクな簡単な処理を行うのであればリストlistで十分な場合が多い

組み込み関数のmax(), min(), sum(), len()を使って、最大値や最小値、合計、平均などを算出する例。len()は要素数を返す関数です。

以下は、for文によるループ処理の例です。

リストの要素の追加や削除については以下の記事をご参照ください。

配列 – array

コンストラクタarray.array()で型コードを指定して生成します。型コードの一覧は公式ドキュメントご参照ください。

型コードと一致しない型の要素は格納できません。

リストと同様の処理が可能です。

多次元配列 – numpy.ndarray

  • NumPyをインストール、importして使う
  • 同じ型しか格納できない
    • object型で様々な型へのポインタを格納することはできる
  • 多次元配列を表現できる
  • 数値計算のためのメソッド・関数が豊富で、高速な演算が可能
    • 行列演算や画像処理など様々な場面で使える

要素ごとに演算をしたり、行列積を求めたりできます。

独断と偏見によるそれぞれの使い分け

いわゆる配列ライクな処理をするのであればリストlistで十分な場合が多いです。

arrayは格納する要素の型が制限されているので厳密なメモリ管理が可能ですが、特に気にする必要がなければlist、より効率的な数値計算を行いたければnumpy.ndarrayのほうがよいと思います。

メモリサイズ、メモリアドレスを必要とするような処理以外に使いどころはない(と思います)。

多次元配列を扱う場合や配列に対する数値計算(科学技術演算)を行う場合はNumPy配列numpy.ndarrayを使います。

コンピュータビジョンライブラリOpenCVや機械学習ライブラリscikit-learnなど多くのライブラリでNumPy配列numpy.ndarrayが使われているので、それらのライブラリを使うと自動的にnumpy.ndarrayを使うことになります。

データ分析ライブラリpandas

表で表現されるような二次元データに対して統計的な処理を行う場合は、データ分析ライブラリpandasが便利です。

pandasでは二次元データをpandas.DataFrameとして扱います。(pandas.Seiriesとして一次元データを扱うことも可能)

pandas.DataFramepandas.Seriesも内部ではnumpy.ndarrayでデータを保持していますが、行・列ごとの操作や表計算ソフトにおけるピボットテーブルのような操作など、データ処理に便利な関数やメソッドが豊富に用意されています。

雰囲気は以下のような感じです。列ごとの平均値を算出したり、属性を指定して集計したりしています。

例のような数値と文字列を含んだデータはNumPyだと扱いが面倒ですが、pandasだと非常に簡単です。

詳しい使い方などは以下の記事をご参照ください。

ということで、今回はPythonのリスト、配列、numpy.ndarrayの違いと使い分けについて、ご紹介しました。