NumPyはPythonの標準リストよりも簡単に多次元配列を扱え、高速に行列計算できることから科学技術の計算や機械学習に使われています。
ここでは
- NumPyって何?
- NumPyの初期化や基本的な使い方は?
- NumPyについて体系的に知りたい
といった方へ、NumPyの使い方をご紹介します。
目次
NumPyの初期化
NumPyの初期化は次のようにやります。
import numpy as np
list = ["りんご", "みかん", "ぶどう"]
np_list = np.array(list)
print(np_list)
print(type(np_list))
['りんご' 'みかん' 'ぶどう']
<class 'numpy.ndarray'>
NumPyの配列を作るにはnp.array()を使い、引数にリストかタプルを渡すことで初期化できます。
NumPyは拡張ライブラリなのでインポートしてから使います。
出力したNumPyのリストは通常のリストと異なり、要素の間のカンマがありません。
Typeを使って調べてみると「numpy.ndarray」と返ってきているのがわかると思います。
ndarrayですが、このクラスは通常のリストと異なり「要素の型の混在ができません」。
ただエラーにはならず、NumPyがいい感じに変換して型を揃えてくれます。
具体的には、floatとintが混ざってたら全てfloatに、数値と文字列が混ざっていたら文字列に変換します。
あとは数値と論理値(True, False)の場合は、Trueが1、Falseが0に置き換えられます。
import numpy as np
list1 = [10, 1.24] #int→float
list2 = [10, 1.24, "りんご"] #数値→文字列
list3 = [10, True, False] #論地理→数値
np_list1 = np.array(list1)
np_list2 = np.array(list2)
np_list3 = np.array(list3)
print(np_list1)
print(np_list2)
print(np_list3)
[ 10. 1.24]
['10' '1.24' 'りんご']
[10 1 0]
多次元リストの初期化
多次元リストの初期化方法を見ていきましょう。
NumPyは1次元より多次元の配列を扱うために作られたようなものなので、多次元配列の扱いに優れています。
作り方はいくつかありますが、一番簡単なのはnp.array()に多次元のリストかタプルを渡す方法です。
下の例では3行3列の要素を3つのリストを使って作成しています。
import numpy as np
list1 = ["1-1", "1-2", "1-3"]
list2 = ["2-1", "2-2", "2-3"]
list3 = ["3-1", "3-2", "3-3"]
np_list = np.array([list1, list2, list3])
print(np_list)
[['1-1' '1-2' '1-3']
['2-1' '2-2' '2-3']
['3-1' '3-2' '3-3']]
3行3列のリストを作成しました。NumPyの多次元リストを出力すると結果のようになります。
NumPyの多次元リストはこの方法以外にreshape()を使うこともできます。reshape()を使うと1次元のリストから多次元リストを作ることができます。
reshape()は何行何列のリストを作りたいかによって必要な要素数が変わります。2行2列なら4つ、3行3列なら9つ、3行4列なら12個の要素が必要です。
次の例では3行2列の多次元リストを作成しています。
import numpy as np
list = ["1-1", "1-2", "2-1", "2-2", "3-1", "3-2"]
np_list = np.array(list).reshape(3, 2)
print(np_list)
[['1-1' '1-2']
['2-1' '2-2']
['3-1' '3-2']]
reshape()の1つ目の引数に行数、2つ目に列数を指定します。ndarrayのメソッドなので、np.array()でndarrayを作成してから使います。
多次元リストへの要素の追加・変更・削除
次に初期化したndarrayへの要素の追加・変更・削除をしてみましょう。
要素の追加 -append()-
要素の追加にはappend()を使います。
1つ目の引数にndarray、2つ目に追加する要素を指定します。また、axisという引数に0を指定すると行、1を指定すると列を追加することができます。
次の例では多次元リストに行を追加しています。
import numpy as np
np_list = np.array([1, 2, 3, 4]).reshape(2, 2)
print(np_list)
append_list = np.array([5, 6]).reshape(1, 2)
print(append_list)
result_list = np.append(np_list, append_list, axis = 0)
print(result_list)
[[1 2]
[3 4]]
[[5 6]]
[[1 2]
[3 4]
[5 6]]
axisに0を指定しているので、今回は行として2つ目の引数に指定したリストを挿入しています。
列として追加したい場合は1を指定します。が、ただ0を1に変えてもエラーになります。
result_list = np.append(np_list, append_list, axis = 1) #axisを1に変更
ValueError: all the input array dimensions except for the concatenation axis must match exactly
なぜかというと、append_listが[[5, 6]]と1行2列の構造になっているからです。これを2行1列の構造に変えると、形がはまって正常に列を追加できます。
import numpy as np
np_list = np.array([1, 2, 3, 4]).reshape(2, 2)
append_list = np.array([5, 6]).reshape(2, 1) #reshape(1, 2)を(2, 1)に変更
print(append_list)
result_list = np.append(np_list, append_list, axis = 1) # axisは1
print(result_list)
[[5]
[6]]
[[1 2 5]
[3 4 6]]
追加するリストを縦にすることで、列として正常に追加することができました。
要素を挿入する-insert()-
要素を挿入する場合はinsert()を使います。append()ではリストの末端に行か列を追加できましたが、insert()では挿入する位置を指定することでリストとリストの間にリストを挿入できます。
次の例では2行2列のリストの間に行を挿入しています。
import numpy as np
np_list = np.array([1, 2, 3, 4]).reshape(2, 2)
insert_list = np.array([5, 6]).reshape(1, 2)
result_list = np.insert(np_list, 1, insert_list, axis = 0)
print(result_list)
[[1 2]
[5 6]
[3 4]]
insertは2つ目の引数に挿入位置を指定します。インデックス番号で0から数えるので、今回は1を指定して行と行の間に新しく行を追加しました。
また、insertもaxisに1を指定することで列を挿入することができます。
appendの時と違い、insertの場合は挿入するリストは2行1列ではなく、1行2列で問題ありません。
import numpy as np
np_list = np.array([1, 2, 3, 4]).reshape(2, 2)
insert_list = np.array([5, 6]).reshape(1, 2) #1行2列で定義
result_list = np.insert(np_list, 1, insert_list, axis = 1)
print(result_list)
[[1 5 2]
[3 6 4]]
要素を削除する-delete()-
delete()を使うことでndarray内の要素を削除できます。
次の例では、row_delete_listでは2行目を、col_delete_listでは2列目を削除しています。
import numpy as np
np_list = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9]).reshape(3, 3)
row_delete_list = np.delete(np_list, 1, axis = 0)
print(row_delete_list)
col_delete_list = np.delete(np_list, 1, axis = 1)
print(col_delete_list)
[[1 2 3]
[7 8 9]]
[[1 3]
[4 6]
[7 9]]
NumPyのリストを通常のリストに戻す
最後にndarrayのリストを通常のリストに戻す方法を見てみましょう。
ndarrayを通常のリストに戻すにはtolist()を使います。
import numpy as np
np_list = np.array(["a", "b", "c"])
np_list2 = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9]).reshape(3, 3)
print(np_list.tolist())
print(np_list2.tolist())
['a', 'b', 'c']
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
一次元のndarrayは一次元のリストに、多次元の場合は多次元のリストに変換されます。