Pythonで配列を扱う際にまず学ぶのが、標準搭載されている「list」だと思いますが、Pythonにはもう一つ、「numpy」という外部ライブラリがあります。
ですが、この2つの何が違うのか、どう使い分ければよいのか、といったことは意外と知らない方もいらっしゃると思います。
そこで今回は、「numpy」と「list」を比較しながら、「numpy」の使い方について解説したいと思います。
1. numpyとlistの違いと使い分け
まず初めに、「numpy」と「list」の違いと使い分けについて簡単に解説します。
numpyのlistとの違い
- numpyの方がlistに比べ、計算速度や処理速度が速い。
- numpyは配列の計算や扱いが楽にできる。
- numpyは配列の形が長方形でなければならない。(後述)
上の違いを見ていただくとわかる通り、「numpy」は配列の扱いや計算に特化しており、そういったことを行う場合「list」よりもはるかに優れています。
では、そのことを踏まえ、使い分けるとすると下のような使い分けをお勧めします。
numpyとlistの使い分け
- 配列を扱ったり計算を行う場合はnumpyを使用。
- 行・列ごとにサイズが違う配列を扱う場合はlistを使用。
計算速度や扱いやすさの点で、圧倒的に「numpy」が優秀なため、基本的にはnumpyを使っていれば問題ありません。
では、次の章からはそんな「numpy」の使い方を実際にコードを動かしながら解説していきます。
もし「list」の使い方も学びたい方は、「Pythonの変数を使ってみよう」を確認してみてください。
2. numpyの配列を作ってみよう
ではまず、「numpy」配列の基本的な作り方について解説します。
「numpy」配列を作る時は、「numpy.array(リスト)」という風に作ります。
では、実際にコードを見ながら詳しく学んでいきましょう!
import numpy as np a = np.array([1,2,3,4,5]) print(a) print(type(a))
上のコードを実行すると、aという変数に[1,2,3,4,5]という配列が作成されたことが分かると思います。
もう少し詳しく説明します。
まず1行目でnumpyをnpという名前でインポートしています。(numpyを使う場合、基本的に「np」という形でインポートするので、覚えておいてください。)
import numpy as np
次に、2行目で最初に解説した「numpy.array(リスト)」の形でnumpy配列を作成しています。([]でくくられた配列が「list」でしたね。)
a = np.array([1,2,3,4,5])
そして、3,4行目はそれぞれ作成された配列と、その形(type)を出力しています。
4行目のtypeの出力で<class ’numpy.ndarray’>と出力されたと思いますが、numpyの配列はこの「numpy.ndarray」という名前で定義されています。
これで、numpyの配列を作ることができました!
ちなみに、「numpy.array(リスト)」のリストは、先に作成しておいても良いため、以下のように作ることもできます。
import numpy as np la = [1,2,3,4,5] a = np.array(la)
上の例では、先にlaという「list」の配列を作り、後からnumpy配列に変換しています。
このように、基本はlistをnumy配列に変換することで作成することができます!
- 「numpy」配列を作る時は、「numpy.array(リスト)」で作成する
- numpyを使う場合、基本的に「np」という形でインポートする
- numpyの配列は「numpy.ndarray」という名前で定義される
3. numpyの便利な点をlistと比較しよう(計算)
では次に、numpy配列を使った計算について解説していきます。listと比較することで、numpyの便利な点を分かりやすくしようと思います。
3.1. 配列と数字の計算
まず、配列に数字を足したり引いたりする場合の処理についてです。numpyとlistそれぞれの書き方を見てみましょう。
まずは、「list」を使う場合、以下のように書きます。
a = [1,2,3,4,5] sa = [] for na in a: sa.append(na + 2) print(sa)
上のように、まずa2という空の「list」を作り、forループを回して1つずつ計算していきます。書き方もforを使うので少し複雑ですね。
では次に「numpy」を使う場合です。
import numpy as np a = np.array([1,2,3,4,5]) sa = a + 2 print(sa)
numpyでは、上のように配列に直接数字を足すことができます!(もちろん、四則演算が全て同じように行えます。)
直感的にも分かりやすいのはnumpyの方だと思います。
3.2. 配列と配列の計算
次に、配列と配列の計算についてです。これもlistとnumpyの両方の書き方を確認してみましょう。
「list」を使用した場合
a = [1,2,3,4,5] a2 = [3,4,2,5,6] sa = [] for i in range(len(a)): sa.append(a[i] + a2[i]) print(sa)
数字を足した時と同じように、forループを使って1要素ずつ足していくことになります。書き方が複雑で少し分かりずらいですね。
また、Pythonはforループの処理がとても遅い特徴があります。ですので、この書き方では処理速度も遅くなります。
では次に、numpyを使用した場合です。
import numpy as np a = np.array([1,2,3,4,5]) a2 = np.array([3,4,2,5,6]) sa = a + a2 print(sa)
numpyでは、上のように配列同士も直接足し合わせることができます!この時、forループも使用しないため、処理速度もlistの時に比べ圧倒的に速いです。
ちなみに、listで同じように書くと、配列が結合される処理になってしまいます。
a = [1,2,3,4,5] a2 = [3,4,2,5,6] sa = a + a2 print(sa)
上のコードの結果は、合計の[4,6,5,9,11]ではなく、[1,2,3,4,5,3,4,2,5,6]と結合された配列になります。
このように、配列で計算を行う際は、「numpy」を使う方が分かりやすく、また処理速度も速くなります。
- numpyでは配列に直接数字を足すことができる
- numpyでは配列同士も直接足し合わせることができる
- Pythonはforループの処理がとても遅い
4. numpy配列の扱い方
次に、numpy配列の扱い方について、listと比較しながら解説します。
4.1 各要素の呼び出し
まず、各要素の呼び出し方についてです。これは基本的にnumpyもlistもあまり変わりませんが、2次元以上の場合少しだけ形が違います。
- listの場合、リスト[行][列]の形で指定する。
- numpyの場合、numpy.ndarray[行, 列]の形で指定する。
実際のコードを見て確認してみましょう。
import numpy as np a = [[1,2,3,4,5],[2,3,4,3,6]] aa = np.array(a) #listの場合 print(a[1][2]) #numpyの場合 print(aa[1,2])
上のように、少し形が違いますね。ちなみに、numpy配列を作る際の「np.array(リスト)」のリストは、上のように2次元以上でも可能です。
4.2. 配列の変形
numpy配列では、配列の形も「reshape」というものを使えば簡単に変形することができます。
import numpy as np a = [[1,2,3,4,5],[2,3,4,3,6]] aa = np.array(a) aa2 = aa.reshape(1,10) aa3 = aa.reshape(5,2)
上の例では、aaという2行5列の配列をaa2では1行10列、aa3では5行2列の配列にそれぞれ変形しています。
4.3. その他の使い方
numpyの配列の扱い方として、他にも以下のような使い方があります。
- 特定の条件に当てはまる配列だけ残す。
- 要素を降順や昇順に並び替える。
- 降順や昇順の順番を配列として出力する。
- 行列の計算(内積や外積)等もできる。
など、今回取り上げた使い方意外にも様々な使い方ができます。
これらについては、また別途解説しようと思いますので今回は省略させていただきます。
- listの要素を呼び出す場合、リスト[行][列]の形で指定
- numpyの要素を呼び出す場合、numpy.ndarray[行, 列]の形で指定
- numpy配列では「reshape」で配列を変形できる
5. numpy配列の形の決まりについて
最後に、numpy配列の決まりについて、冒頭で述べた配列が長方形型でなければならない、ということについて解説します。
長方形型と言いましたが、簡単に言うと各行、列が一定でなければならない、ということです。
例えば、下のような配列はlistでは作成可能ですが、numpyでは作成できずエラーとなります。
実際にコードで確認してみましょう。
import numpy as np a = [[1,2,3,4,5],[2,3]] na = np.aary(a)
上のコードを実行すると、「list」配列の「a」は作成できますが、「numpy」配列の「na」はエラーが出て作成できません。
このように、配列が長方形にならないものはnumpyで配列を作ることができないため、「list」を用いることをお勧めします。
- numpy配列は各行、列が一定でなければならない
- 各行、列の数が違ってもlist配列は作成可能
6. おわりに
今回は、numpyについて基本的な使い方や、listと比較しつつ便利な点について解説しました。
Pythonを使って数値計算等を行い場合は間違いなくnumpyを使った方が計算もしやすく、また処理も速いため、使用することをお勧めします。
ちなみに、初心者の方向けに「Python初心者入門講座」という講座を作っていますので、気になった方はそちらもご覧いただけると幸いです。
コメント
コメント一覧 (3件)
Aiを学んでいる者です。計算をするプログラムコ-ドでlistからNumpy配列にする理由が不明、今回このサイト見て説明が理解し易くとても参考になりました。有り難う御座いました。
参考になったとのコメントありがとうございます。
サイトを運営する励みになります。
以前メ-ルした宇田川です。
気付いた箇所がありましたので、
python初心者講座(15)
第12章CSVファイルを読み込んでみようの
コ-ドでopen()関数を使っているのでf.closeを記載する必要があるのではないですか?
学習をしていて納得がいかないのです。
お忙しい中とは存じますがご返答をお願い致します。