【Python】ndarrayとは?通常の配列との違いと作成方法

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は、ある意味適当にプログラムを書いても動いてしまいます(型を意識する必要があまりないため)。

一方で、気が付かないうちに処理が重くなってしまう場合もあります。

ライブラリの特徴を理解し、最適なプログラムを書けるようにしたいですね。

ではでは👋