Pythonで配列を扱うと、通常の配列とndarrayという配列が存在することに気が付きます。
「なんで配列の種類が2つもあるんだ?」
と疑問を持つ方も多いと思います。私もその1人でした。
今回は、通常の配列とndarrayの違いを掘り下げていき、さらにndarrayの簡単な使い方を紹介したいと思います。
通常の配列とndarrayの違い
ndarrayとは
ndarrayとは、numpyというライブラリが提供する配列です。ndarrayのndは、”N dimension”の省略で、配列を意味する”array”と組み合わせ、「N次元配列」という意味になります。
両者の配列の違いについて見ていきます。
格納できる型
Python標準の配列では、1つの配列に様々な型のデータをmixして格納することができます。
x = ["a",2,3,False,5]
という配列を作ると、0番目はstr型、1番目はint型、3番目にはbool型のデータが格納されます。
一方、ndarrayでは、1つの配列には1つの型のデータしか格納することができません。例えば、上記と同じデータをndarrayに格納しようとすると、すべて文字列として扱われてしまいます。
import numpy as np
y = np.array(["a",2,3,False,5])
全ての要素がstr160という型の配列になりました。
一応、個々の要素の型も確認しておきます。
for i,element in enumerate(y):
print(str(i) + "番目 [ "+ str(element) +" ]: " + str(type(element)))
#Output
0番目 [ a ]: <class 'numpy.str_'>
1番目 [ 2 ]: <class 'numpy.str_'>
2番目 [ 3 ]: <class 'numpy.str_'>
3番目 [ False ]: <class 'numpy.str_'>
4番目 [ 5 ]: <class 'numpy.str_'>
<class 'numpy.str_'>
全ての要素が文字列となっています。
型の判別は自動で行われます。格納する要素が全て整数の場合はint型、boolの場合はbool型の配列になります。
ndarrayでは、データの型を揃えることでメモリの使用量を抑え、コードの最適化を図っています。データ分析では大量のデータを扱うので、それぞれ型が異なる標準の配列を用いるよりも、ndarrayの方が処理時間が短くなることもメリットです。
次元表現
ndarray(N次元配列)という名前の通り、ndarrayでは多次元データを表現することができます。
たとえば、以下のような配列を作成します。
twoD_Array = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])
この配列は、2次元の行列を表しています。
配列に格納されている3つの配列がそれぞれ行の役割を果たします。
この特徴によって、ndarrayでは様々な計算処理が可能になります。
注意点としては、各要素の配列の要素数が全て同じである必要があります。
例えば、以下のようなndarrayを作成しようとすると、エラーが発生します。
import numpy as np
twoD_Array = np.array([[1,2,3,4],[5,6,7,8],[9,10,11]])
#Output
VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences (which is a list-or-tuple of lists-or-tuples-or ndarrays with different lengths or shapes) is deprecated. If you meant to do this, you must specify 'dtype=object' when creating the ndarray
twoD_Array = np.array([[1,2,3,4],[5,6,7,8],[9,10,11]])
3つ目の配列の要素数が異なるのでエラーになりました。
ndarrayの作成方法
配列の作成方法はいくつかあります。
一次元配列
a = np.array([1,2,3,4])
print(a)
#Output
[1 2 3 4]
型を指定したい場合は、引数に型を加えます。
a = np.array([1,2,3,4], np.int64)
連番の配列を生成したい場合は、np.arange()を用います。
<span class="green">#0から始まる要素数4の配列を作成</span>
b = np.arange(4)
print(b)
#Output
[0 1 2 3]
<span class="green">#4~10までの連番配列を作成(※10は含まれない)</span>
c = np.arange(4, 10)
print(c)
#Output
[4 5 6 7 8 9]
<span class="green">#公差2で4~10までの配列を作成</span>
d = np.arange(4, 10, 2)
print(d)
#Output
[4 6 8]
<span class="green">#Python配列をndarrayに変換</span>
data = [1,2,3,4,5]
e = np.array(data)
print(e)
#Output
[1 2 3 4 5]
多次元配列
reshape()を使うことで、二次元配列や三次元配列を作成することもできます。
<span class="green">#4*4の二次元配列を作成</span>
f = np.arange(16).reshape(4,4)
print(f)
#Output
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]]
<span class="green">#3*2*3の三次元配列を作成</span>
g = np.arange(18).reshape(3,2,3)
print(g)
#Output
[[[ 0 1 2]
[ 3 4 5]]
[[ 6 7 8]
[ 9 10 11]]
[[12 13 14]
[15 16 17]]]
まとめ
Pythonの標準配列とnumpyのndarrayの違いを見てきました。
ndarrayは大量のデータの計算を想定しているようで、それに特化したつくりとなっているみたいですね。まあ、他の言語からすれば型を揃えるなんてことは当然なんですが。
Pythonは、ある意味適当にプログラムを書いても動いてしまいます(型を意識する必要があまりないため)。
一方で、気が付かないうちに処理が重くなってしまう場合もあります。
ライブラリの特徴を理解し、最適なプログラムを書けるようにしたいですね。
ではでは👋