PythonのリストとNumpy arrayの違い

Just another WordPress site

PythonのリストとNumpy arrayの違い

これまでPythonで科学計算をするときにはNumpyを使っていました。
広く用いられているライブラリなのでそういうものなんだと思って特に疑問も抱かずに使ってきたNumpyですが、“Python Data Science Handbook”を読み始めて初めてリストとの違いを理解できた気がするのでメモしておきます。
内容に興味がある方は上記のリンク先のNumpyの章を読むのがいいと思います。

  • Pythonの基本的なデータ型のひとつにリストがあり、どんなデータ型の変数でも格納できる
  • 一方で数値データを扱う際にはデータ型が固定されたNumpy arrayが用いられることが多い
  • この理由は、リストに含まれている要素はそれぞれがメモリー上の異なる領域に格納されていてひとつひとつが完全な情報を持っているのに対して、Numpy arrayはメモリー上のある隣接した領域に格納されていて効率的に取り出せるから

Pythonの基本的なデータ型のひとつがリストです。リストには任意のデータ型の変数を任意の個数だけ格納することができ、様々な場面で使用されます。

例えば0から9までの整数のリストが欲しければ、以下のようにして簡単に作成することができます。

int_list = list(range(10))
print(int_list)
#[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

また、文字列を要素として持つリストを作成することもできます。

str_list = [str(int) for int in int_list]
str_list
#['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']

さらに、リストの要素のデータ型はバラバラでも問題ありません。
これは、リストの個々の要素が自身のデータ型についての情報を保持していることを意味します。

var_list = [0, True, "2", 3.0]
[type(var) for var in var_list]
#[int, bool, str, float]

これに対して、Numpyではarrayに含まれる要素のデータ型は全て同じです。
試しに先ほど作成した要素のデータ型が異なるリストをNumpy arrayに変換してみると以下のようになります。

import numpy as np
np.array(var_list)
#array(['0', 'True', '2', '3.0'], dtype='<U21')

全ての要素が ‘<U21’ というデータ型(文字列)に変換されているようです。

上記のケースではNumpy arrayはリストが持っていた情報を失ってしまっています。
しかし、要素のデータ型が共通である、というこの特性によってNumpyは効率的な計算を可能にしているらしいです。

先ほど見たように、リストの要素はそれぞれが変数として完全な情報を持っています。
より技術的な話をすると、各要素はコンピューターのメモリ上のある領域に格納されていて、そこにはデータ型や値の情報が含まれています。
したがってリストのある要素を抽出するとき、コンピューターはその要素が格納されているメモリ上の領域を参照して情報を取得します。

ところが、このようなやり方は数値計算をする際には効率的ではありません。
なぜなら、計算に登場する変数のデータ型は全て同じだからです。
(厳密には整数形や浮動小数点型、ビット数の違いなどがありますが、数値という意味では同じです。)

数値を格納したリストを用いて計算を行おうとすると、メモリ上の異なる領域に保持されている個々の要素の情報を(データ型は単一にも関わらず)その都度参照しなければならず、冗長になってしまいます。

一方でNumpyではarray全体としてひとつのデータ型の情報を持ち、全ての要素はメモリ上のまとまった領域に格納されています。
これにより、素早く値を取り出して効率的に数値計算を行うことを可能にしているようです。

以上、なんとなくNumpyを使ってきた人間の勉強メモでした。

Tags: ,

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です