NumPy配列の作成の9つの方法

NumPyの配列の作成方法は、Python標準オブジェクトのリストに比べて、遥かに豊富に用意されており、かつ、高速に動作します。それによって、様々な科学技術計算やデータエンジニアリングが行いやすくなっています。

その中で、このページでは、よく使う配列の作成方法をすべてコンパクトにまとめています。参考にして頂ければ嬉しく思います。

乱数配列の作成方法について
乱数の配列については、別途、『NumPyのrandomの全ての乱数配列の作成方法まとめ』で全てまとめています。あわせて確認頂ければ、どのような配列でも自由に作成することが可能になるでしょう。

目次

1. 基本的な配列作成

まずは、最も基本的な配列作成方法を解説します。以下の3つです。

  • np.array()
  • np.arange()
  • np.linspace()

早速、確認していきましょう。

1.1. np.array: リストを配列に変換

np.arrayはリストやタプルを NumPy配列に変換する関数です。

引数にリストやタプルを渡せば、そのデータから配列を作成します。

In [1]:
import numpy as np
#  リストやタプルから配列を生成
np.array([1, 2, 3])
Out[1]:
array([1, 2, 3])

2重リストを渡すと2次元配列(行列)、3重リストを渡すと3次元配列(テンソル)に変換します。以下のコードは2重リストを渡した場合です。

In [2]:
#  2重リストを渡すと2次元配列を生成
np.array([[1, 2, 3], [4, 5, 6]])
Out[2]:
array([[1, 2, 3],
       [4, 5, 6]])

よくある間違いとして、引数にリストやタプルなどのシーケンスではなく、数値を直接渡してしまうというものがあります。その場合はエラーになりますので気をつけましょう。

In [3]:
# よくある間違い。引数に数値を渡してしまう。
np.array(1, 2, 3)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-39-cdb81688cbab> in <module>
----> 2 np.array(1, 2, 3)

TypeError: array() takes from 1 to 2 positional arguments but 3 were given

1.2. np.arange: 指定の公差の等差数列を作成

np.arangeは任意の数値の範囲の等差数列を作成する関数です。数値の範囲だけでなく公差を指定することも可能です。

基本的に第一引数には開始位置(start)、第二引数には終了位置(stop)、第三引数には公差(step)を渡します。これらはキーワード引数として渡すことも可能ですが、その方法は一般的ではありません。

それぞれ見ていきましょう。

引数で数値を1つだけ渡すと、その数値を終了位置とする公差1の配列を作成します。なお、終了位置に指定した数値は配列には含まれません。

In [1]:
import numpy as np
np.arange(5)  #  連番の配列を生成。
Out[1]:
array([0, 1, 2, 3, 4])

引数には小数を渡すこともできます。その場合、以下のように要素がfloat型の配列を生成します。

In [2]:
np.arange(5.0)  #  小数を渡すと要素の型がfloat型になります。
Out[2]:
array([0., 1., 2., 3., 4.])

開始数値mと終了数値nを指定すると、mで始まり、n-1で終わる公差1の配列を生成します。

In [3]:
np.arange(1, 11)  #  1から10の連番の配列を生成。
Out[3]:
array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10])
In [4]:
np.arange(0.5, 5.5)  #  0.5から4.5の連番の配列を生成。
Out[4]:
array([0.5, 1.5, 2.5, 3.5, 4.5])

任意の公差を指定したい場合は、第三引数で指定します。例えば、偶数の配列を生成するには次のように書きます。

In [5]:
np.arange(0, 11, 2)  #  0から10までの公差2の数値の配列を生成。
Out[5]:
array([ 0,  2,  4,  6,  8, 10])

小数も指定可能です。指定した公差の配列を生成します。

In [6]:
np.arange(0, 2, 0.2)  #  公差は小数点でも可能。
Out[6]:
array([0. , 0.2, 0.4, 0.6, 0.8, 1. , 1.2, 1.4, 1.6, 1.8])

ステップに負の数値を指定すると、数値逆順の配列を生成します。この場合、開始位置を終了位置よりも大きい数値にする必要があります。

In [7]:
np.arange(3, -1, -0.5)  #  負の値の公差(逆順)も可能。
Out[7]:
array([ 3. ,  2.5,  2. ,  1.5,  1. ,  0.5,  0. , -0.5])

多次元配列を作成したい場合は、reshapeメソッドと組み合わせます。

In [8]:
np.arange(10).reshape(2, 5)
Out[8]:
array([[0, 1, 2, 3, 4],
       [5, 6, 7, 8, 9]])

1.3. np.linspace: 指定の要素数の等差数列を作成

np.linspaceも、np.arangeと同じく等差数列の配列を生成するために使う関数です。

linspaceでは、arangeと違って、第三引数に公差ではなく要素数を渡します。また、終了位置(stop)の値も配列に含まれます。さらに、要素が浮動小数点数(float型)の配列を作成するには、arangeよりもこちらの方が計算精度が優れています。

それではコードを見ていきましょう。linspaceでは、第一引数の開始位置(start)と、第二引数の終了位置(stop)は必須引数です。第三引数の要素数(num)を指定しない場合は、作成される配列の要素数は自動的に50になります。

In [1]:
#  デフォルトでは要素数は50
np.linspace(1, 50)
Out[1]:
array([ 1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9., 10., 11., 12., 13.,
       14., 15., 16., 17., 18., 19., 20., 21., 22., 23., 24., 25., 26.,
       27., 28., 29., 30., 31., 32., 33., 34., 35., 36., 37., 38., 39.,
       40., 41., 42., 43., 44., 45., 46., 47., 48., 49., 50.])

第三引数で、生成する配列の要素の数(配列の長さ)を指定することができます。

In [2]:
#  第三引数で生成する配列の要素数を指定
np.linspace(1, 50, 5)
Out[2]:
array([ 1.  , 13.25, 25.5 , 37.75, 50.  ])

逆順も可能です。

In [3]:
np.linspace(50, 0, 5)
Out[3]:
array([50. , 37.5, 25. , 12.5,  0. ])

多次元配列を作成したい場合は、reshapeメソッドと組み合わせます。

In [4]:
np.linspace(0, 10, 8).reshape(4, 2)
Out[4]:
array([[ 0.        ,  1.42857143],
       [ 2.85714286,  4.28571429],
       [ 5.71428571,  7.14285714],
       [ 8.57142857, 10.        ]])

2. 初期化配列の作成

次に初期化配列(すぐに使えるように準備された配列)の作成において頻繁に使うことになる4つの方法を解説します。以下の通りです。

  • np.zeros()
  • np.ones()
  • np.empty()
  • np.full()

それぞれ確認していきましょう。

2.1. np.zeros: 0埋めの配列を作成

np.zerosは、全ての要素が0の配列を作成する関数です。

引数には配列のshapeをタプルで渡します。ただし1次元配列を作成する場合は数値を渡すだけでも構いません。

In [1]:
import numpy as np
# 1次元配列を生成
np.zeros(5)
Out[1]:
array([0., 0., 0., 0., 0.])

2次元配列以上を作成する場合は、必ずshapeをタプルで渡す必要があります。

In [2]:
# 多次元配列の場合はshapeをタプルで渡す
np.zeros((2, 5))
Out[2]:
array([[0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0.]])

2.2. np.ones: 1埋めの配列を作成

np.onesは、全ての要素が1の配列を作成する関数です。

引数には配列のshapeをタプルで渡します。ただし1次元配列を作成する場合は数値を渡すだけでも構いません。

In [1]:
import numpy as np
#  長さ5の1次元配列を生成
arr1 = np.ones(5)

#  こちらの書き方でも可能です。
arr1 = np.ones((5,))

print(arr1)
[1. 1. 1. 1. 1.]

2次元配列や3次元配列を作成したい場合、shapeは必ずタプルで渡す必要があります。

In [2]:
#  2次元配列を生成
arr2 = np.ones((2, 5))
print('2次元配列: \n', arr2, '\n')

#   3次元配列を生成
arr3 = np.ones((2, 2, 5))
print('3次元配列: \n', arr3)
2次元配列: 
 [[1. 1. 1. 1. 1.]
 [1. 1. 1. 1. 1.]] 

3次元配列: 
 [[[1. 1. 1. 1. 1.]
  [1. 1. 1. 1. 1.]]

 [[1. 1. 1. 1. 1.]
  [1. 1. 1. 1. 1.]]]

2.3. np.empty: 空の配列を作成

np.emptyは、空の配列を作成する関数です。zerosones よりも高速なため、空の配列を作成しておいて要素は後から埋めたいという場合に使います。

なお「空」といっても、厳密にはメモリに格納されている値がランダムに割り当てられます。

引数には配列のshapeをタプルで渡します。ただし1次元配列を作成する場合は数値を渡すだけでも構いません。

以下のコードでは長さ5の1次元配列を生成しています。

In [1]:
import numpy as np
#  長さ5で要素の値が初期化されていない1次元配列を生成
arr1 = np.empty(5)
#  こちらの書き方でも可
arr1 = np.empty((5,))

print(arr1)
[-1.28822975e-231 -1.28822975e-231  1.78837779e-202  4.72057675e-284
  1.18500631e-303]

多次元配列を生成する場合は、shapeは必ずタプルで指定します。

In [2]:
#   2次元配列を生成
arr2 = np.empty((2, 2))
print('2次元配列\n', arr2, '\n')

#  3次元配列を生成
arr3 = np.empty((2, 2, 3))
print('3次元配列\n', arr3)
2次元配列
 [[1.43279037e-322 1.28822975e-231]
 [1.28822975e-231 1.08694442e-322]] 

3次元配列
 [[[-1.28822975e-231 -1.28822975e-231  5.92878775e-323]
  [ 0.00000000e+000  0.00000000e+000  0.00000000e+000]]

 [[ 0.00000000e+000  0.00000000e+000  0.00000000e+000]
  [ 0.00000000e+000  0.00000000e+000  0.00000000e+000]]]

2.4. np.full: 指定の値で埋めた配列を作成

np.fullは、全ての要素を任意の値で埋めた配列を作成する関数です。

第一引数に作成する配列のshape、第二引数に任意の値を指定します。

以下のコードでは、長さ5で初期値が0.1の1次元配列を生成しています。

In [1]:
import numpy as np
#  shape(5, )で初期値が0.1の初期化配列を生成
np.full(5, 0.1)
Out[1]:
array([0.1, 0.1, 0.1, 0.1, 0.1])

多次元配列を生成する場合は、shapeはタプルで渡さなければいけません。間違えて数値で渡さないようにしましょう。

In [2]:
#  多次元配列の場合、shapeをタプルで渡す
np.full((2, 5), 10)
Out[2]:
array([[10, 10, 10, 10, 10],
       [10, 10, 10, 10, 10]])

3. 単位行列の作成

続いて、単位行列を作成する方法を解説します。「単位行列」とは、対角線の要素が1で、それ以外の要素は0で構成されている配列のことです。これは One-hot とも呼ばれ、機械学習の「特徴量エンジニアリング」というステップで頻繁に出てくる重要な配列です。

以下の2つがあります。

  • np.identity()
  • np.eye()

それぞれ見ていきましょう。

3.1. np.identity: 単位正方行列を作成

np.identityは、正方形の単位行列を作成する関数です。

引数には数値を1つ渡すだけです。

In [1]:
import numpy as np
np.identity(3)
Out[1]:
array([[1., 0., 0.],
       [0., 1., 0.],
       [0., 0., 1.]])

3.2. np.eye: 指定の形状の単位行列を作成

np.eyeは任意のshapeの単位行列を作成する関数です。1を配置する対角線の位置も指定することが可能です。

第一引数には横軸の要素数、第二引数には縦軸の要素数、第三引数には対角線要素の開始位置を渡します。

第一引数だけ渡した場合は、正方形の単位行列を作成します。

In [1]:
'''  引数を1つだけ渡す場合  '''
import numpy as np
np.eye(3)
Out[1]:
array([[1., 0., 0.],
       [0., 1., 0.],
       [0., 0., 1.]])

第一引数Nと第二引数Mを渡した場合は、shape(N, M)の2次元配列を生成します。

In [2]:
'''  第一引数で行数、第二引数で列数を指定  '''
arr = np.eye(3, 4)
print(arr)
[[1. 0. 0. 0.]
 [0. 1. 0. 0.]
 [0. 0. 1. 0.]]

第三引数kでは、1を配置する対角線の開始位置のインデックスを指定することができます。

In [3]:
'''  第三引数で対角線のインデックスを指定  '''
arr1 = np.eye(3, 5, 1)
print('arr1:\n', arr1, '\n')

#  こちらの書き方も可能です。
arr2 = np.eye(5, k=2)
print('arr2:\n', arr2)
arr1:
 [[0. 1. 0. 0. 0.]
 [0. 0. 1. 0. 0.]
 [0. 0. 0. 1. 0.]] 

arr2:
 [[0. 0. 1. 0. 0.]
 [0. 0. 0. 1. 0.]
 [0. 0. 0. 0. 1.]
 [0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0.]]

4. まとめ

以上がNumPyの配列の作成においてよく使う9つの方法です。最後に、一覧でまとめておきたいと思います。

関数 説明
array リストを配列に変換
arange 指定の公差の等差数列を作成
linspace  指定の要素数の等差数列を作成
zeros 0埋めの初期化配列を作成
ones 1埋めの初期化配列を作成
empty 空(未初期化)の配列を作成
full 指定の値の初期化配列を作成
identity   単位正方行列を作成
eye 指定のshapeの単位行列を作成

なお、NumPyにはこれ以外にも、様々な乱数の配列を作成する方法が用意されています。それについては、以下のページで解説しています。

乱数配列が必要な時はぜひご覧ください。



よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

目次
閉じる