【NumPy】NumPyのndarrayとPython組み込み型のlistとの違い ~なぜ分析でndarrayを使うのか~

Python でデータ分析では、NumPy の ndarray を使用します。これは、Python 組み込み型の list とは何が違うでしょうか。この記事では、NumPy の ndarray と Python 組み込み型の list の違いを解説します。
目次
NumPy の ndarray 型と
Python 組み込み型の list 型
Python のデータ分析では、NumPy の ndarray 型を使用します。ndarray は以下のように Python 組み込み型である list 型データを使用して作成することができます。
import numpy as np # list型 data = [1, 2, 3, 4, 5] print(type(data)) # ndarray型 array_data = np.array(data) print(type(array_data))
【実行結果】 <class 'list'> <class 'numpy.ndarray'>
どちらも連続するシーケンスデータを扱うので同じように感じるかもしれません。
しかし、NumPy の ndarray 型は、大量データを高速に処理できるように設計されているため、大量データ分析では ndarray 型の使用が適切です。
この記事では、ndarray と list の違いを紹介していきます。
Python の型の理解を深める
Python は動的型付け言語
Pythonは、動的型付け言語であり、型を指定する必要はありません。C/C++ や Java 等を経験された型にとっては、少し違和感を感じるかもしれません。
例えば、C 言語では、以下のように型をつけて変数を宣言します。その後に、変数に異なる型の値を代入しようとするとエラーとなります。
int x = 1; x = "sample_text"; // <- ERROR
一方で、Python では同じようなコードを書いてもエラーにはなりません。これは、Python が実行時に動的に型を理解して適切に処理するためです。
x = 1 x = 'sample_text'
Python の型は C 言語の構造体となっている
標準的な Python の言語自体は C 言語を使って実装されています(これを、CPython と言います)。他にも Java で実装されている Jython などもありますが、以降は CPython として説明していきます。
int 型について見てみると、Python の int は、C 言語の int とは違います。Python の int は、C 言語の構造体として定義されており、int の値の他にも色々な情報を持っています。以下が、Python の int のイメージです。

これは、C 言語の int に比べて Python の int の方が、処理に要するオーバーヘッドが大きいということを意味しています。
Python の list は任意の型の値で構成できる
次に、Python のリストを見てみます。Python のリストでは以下のように、複数の型を持つリストが定義できます。
data = [0, '1', True, 2.0] data_types = [type(d) for d in data] print(data) print(data_types)
【実行結果】 [0, '1', True, 2.0] [<class 'int'>, <class 'str'>, <class 'bool'>, <class 'float'>]
通常は、数値なら数値リスト、文字列なら文字列のリストとして使う方が多いと思いますが、Python では、上記のような使用できることを理解しておいてください。
では、これらを踏まえて ndarray と list の違いを見ていきましょう。
ndarray と listとの違い
~なぜ分析で ndarray を使うのか~
ndarray は処理に効率的なデータ構造となっている
NumPy の ndarray と Python 組み込みの list はデータの構造が異なっています。
それぞれのイメージは以下の通りです。

ndarray は、連続するデータブロックの 1 つのポインタのみを持つような形となり、データのシーケンスはそこから連続するブロックに格納されます。配列データに、アクセスする際には、このポインタからデータを取得できるため高速です。
一方で、Python 組み込み型の list では、Python オブジェクトへのポインターのリストという構造となっています。Python のリストは様々な型を含められる特徴上、メモリ上で連続するブロックに格納されているとは限りません。
小さなデータサイズでは大きな影響は出ませんが、データ分析で扱いたいような大容量データのアクセスでは違いが出ます。データアクセスでは、連続するブロックにデータがある方が効率であり、データサイズが大きくなればなるほど、違いは顕著です。
このように、ndarray は大量データ分析に適したデータ構造を持っています。
ndarray には豊富なデータ操作のメソッドがたくさんある
NumPy の ndarray は、データ分析のために作られたものであるため、データ操作のためのメソッドが豊富に用意されています。
ndarray の公式ドキュメントはこちらを参考にしてください。ドキュメントの Methods 欄にデータ操作のためのメソッドが豊富に用意されています。
他のデータ分析ライブラリとの連携が容易
データ分析では、NumPy の他にも pandas や scikit-learn などがあります。これらのライブラリは、NumPy との連携を考慮した作りとなっているため、NumPy に慣れておくことはデータ分析を効率的に進めるために重要です。
まとめ
NumPy の ndarray と Python 組み込み型の list の違いを解説しました。ndarray と list におけるデータ構造の側面から違いを説明しています。
データ分析で、NumPy を使う分には、この記事で紹介したような内容を意識する必要は正直ありませんが、NumPy の作りについて理解を深めておくことは、自身のレベルを上げるためにも非常に有効ですので、参考にしていただければと思います。


のスライス」と「Python組み込みのlistのスライス」の違い-1.jpg)
の属性情報の確認方法-_-dtype-size-shape-ndim-itemsize-nbytes-_.jpg)

を用いた配列(ndarray)の計算.jpg)
の作成方法-_array-zeros-ones-full-arange-random-randint-randn-normal-linspace-eye-empty_.jpg)
の基本.jpg)