[NumPy] 配列生成関数

[NumPy] 配列生成関数

≫ ndarray の基本的な作成法についてはこちらの記事を参照してください。

配列生成関数

 NumPy には配列を生成する関数がいくつか用意されています。

numpy.arange()

 numpy.arange() は連続数字を要素にもつ配列を生成します。
 使い方は組み込み関数 range() とほとんど同じです。

 numpy.arange([start,] stop [,step], dtype=None)

 numpy.arange(n) と記述すると、0 から n - 1 までの数字が並ぶ配列が生成されます。

import numpy as np

# 0~9の連続数字配列を作成
x = np.arange(10)

print(x)
[0 1 2 3 4 5 6 7 8 9]

 numpy.arange(m, n) と記述すると、m から n - 1 までの連続数字配列が生成されます。

import numpy as np

# 3~8の連続数字配列を作成
x = np.arange(3, 9)

print(x)
[3 4 5 6 7 8]

 3 つめの引数は step 数です。numpy.arange(m, n, s) は m から始まって s 間隔で n - 1 までの数字を生成します。

import numpy as np

# 1~9の奇数が並ぶ配列を作成
x = np.arange(1, 10, 2)

print(x)
[1 3 5 7 9]

 オプション引数 dtype には要素のデータ型を渡します。
 省略すると入力値から類推して自動的にデータ型が決定されます。

import numpy as np

# 0~9のfloat型連続数字配列を作成
x = np.arange(10, dtype = float)

print(x)
[0. 1. 2. 3. 4. 5. 6. 7. 8. 9.]

 reshape()関数を使って連続数字の 2 次元配列を生成することもできます。

import numpy as np

# 1~9の連続数字配列を作成
x = np.arange(1, 10).reshape(3, 3)

print(x)
[[1 2 3]
 [4 5 6]
 [7 8 9]]

 

numpy.zeros()

 numpy.zeros() は 0 で埋め尽くされた配列を生成します。

 numpy.zeros(shape, dtype=None, order="C")

 numpy.zeros(9) は 9 個の 0.0 が並ぶ配列を生成します。

# NumPyをインポート
import numpy as np

# 0で埋め尽くされた要素数9の配列を生成
# データ型は整数(int)
x = np.zeros(9)

print(x)
[0. 0. 0. 0. 0. 0. 0. 0. 0.]

 デフォルトでは要素のデータ型が float になっています。
 データ型は dtype で指定することができます。

# NumPyをインポート
import numpy as np

# 0で埋め尽くされた要素数9の配列を生成
x = np.zeros(9, dtype = int)

print(x)
[0 0 0 0 0 0 0 0 0]

 shape にタプルを渡して配列の形を指定することができます。

# NumPyをインポート
import numpy as np

# 0で埋め尽くされた要素数9の配列を生成
# データ型は整数(int)
x = np.zeros((3, 3), dtype = int)

print(x)
[[0 0 0]
 [0 0 0]
 [0 0 0]]

 

numpy.ones()

 numpy.ones() は 1 で埋め尽くされた配列を生成します。

 numpy.ones(shape, dtype=None, order="C")

 たとえば、numpy.ones(9) は 9 個の 1 が並ぶ配列を生成します。
 データ型は dtype で指定します (デフォルトは float)。

# NumPyをインポート
import numpy as np

# 1で埋め尽くされた要素数9の配列を生成
# データ型は整数(int)
x = np.ones(9, dtype = int)

print(x)
[1 1 1 1 1 1 1 1 1]

 shape にタプルを渡して配列の形を指定することができます。

# NumPyをインポート
import numpy as np

# 1で埋め尽くされた要素数9の配列を生成
# 各要素のデータ型は整数(int)
x = np.ones((3, 3), dtype = int)

print(x)
[[1 1 1]
 [1 1 1]
 [1 1 1]]

 

numpy.full()

 numpy.full() は同じ要素で埋め尽くされた配列を生成します。

 numpy.full(shape, fill_value, dtype=None, order='C')

 たとえば全ての要素が 5 である 2 × 3 の配列を作りたいときには、shape に (2, 3), fill_value に 5 を渡します。

# NumPyをインポート
import numpy as np

# 全ての要素が 5 である 2 × 3 の配列を生成
x = np.full((2, 3), 5, dtype = "int32")

print(x)
[[5 5 5]
 [5 5 5]]

 

numpy.eye()

 numpy.eye() は対角線上に 1 が並ぶ配列を生成します。

 numpy.eye(N, M=None, k=0, dtype=None, order='C')

 たとえば、3 × 3 の単位配列を作りたいときには引数 N に 3 を渡します。

# NumPyをインポート
import numpy as np

# 3 × 3 の単位配列を生成
x = np.eye(3, dtype = "int32")

print(x)
[[1 0 0]
 [0 1 0]
 [0 0 1]]

 
 引数 M には配列の列数を指定します(省略すると M = N です)。引数 k には対角線左上隅の 1 の位置を渡します。列(右)方向にずらす場合は正の値を、行(下)方向にずらす場合は負の値を指定します。

# NumPyをインポート
import numpy as np

# 3 × 3 の単位配列を生成
x = np.eye(3, 4, k = 1, dtype = "int32")

print(x)
[[0 1 0 0]
 [0 0 1 0]
 [0 0 0 1]]

 

numpy.identity()

 numpy.identity() は主対角成分に 1 が並ぶ正方配列(単位配列)を生成します。

 np.identity(n, dtype=None)

 第1引数で配列のサイズを指定します。たとえば、3×3 の単位配列を生成するときは次のようなコードを記述します。

# 3×3 の単位配列を生成
x = np.identity(3, dtype = np.int)

print(x)
[[1 0 0]
 [0 1 0]
 [0 0 1]]

 

いちばんやさしいPythonの教本 人気講師が教える基礎からサーバサイド開発まで 「いちばんやさしい教本」シリーズ

numpy.matrix()

 numpy.matrix() は文字列から配列を生成する関数です。

 numpy.matrix(data, dtype=None, copy=True)

 この関数で配列を生成するときは、各行を ";" で区切って指定します。

# NumPyをインポート
import numpy as np

# 2次元配列を生成
x = np.matrix("1 2 3 ; 4 5 6 ; 7 8 9")

print(x)
[[1 2 3]
 [4 5 6]
 [7 8 9]]

 各要素のデータ型は dtype で指定します。

# NumPyをインポート
import numpy as np

# 2次元配列を生成
# データ型は複素数(complex)
x = np.matrix("1 2 3 ; 4 5 6", dtype = "complex")

print(x)
[[1.+0.j 2.+0.j 3.+0.j]
 [1.+0.j 2.+0.j 3.+0.j]]

 

numpy.linspace()

 numpy.linspace() は開始値 (start) から終了値 (stop) まで均等間隔に数字を並べます(すなわち等差数列を生成します)。

 numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)

 第 3 引数 num には要素数を指定します (デフォルトは 50)。
 たとえば、[10 20 30 40 50] という配列を作りたいときは次のようなコードを書きます。

# NumPyをインポート
import numpy as np

# 開始値10,終了値50,要素数5の等差数列
# データ型(dtype)はintを指定
x = np.linspace(10, 50, 5, dtype = int)

print(x)
[10 20 30 40 50]

 endpoint を False にすると、stop に指定した数を含みません。

# NumPyをインポート
import numpy as np

x = np.linspace(10, 50, 5, dtype = int, endpoint = False)

print(x)
[10 18 26 34 42]

 retstep は配列のあとに公差を表示するか否かのオプションです。
 デフォルトでは False になっているので、表示したいときは True を指定します。

# NumPyをインポート
import numpy as np

# 開始値10,終了値3,要素数3の等差数列(公差を表示)
x = np.linspace(10, 20, 3, retstep = True)

print(x)
(array([10., 15., 20.]), 5.0)

 

numpy.logspace()

 numpy.logspace() は対数スケールで等間隔の配列を生成します。

 numpy.logspace(start, stop, num=50, endpoint=True, base=10.0, dtype=None)

 endpoint が True であるとき、配列の最初の要素は base ** start, 最後の要素は base ** stop です。要素の個数は num で指定します。たとえば、$10^2$ から $10^4$ まで 5 個の要素を対数スケールで等間隔に並べる場合は次のコードを記述します。

import numpy as np

# 10**2から10**4まで、10を底とする対数スケールで要素が等間隔に並ぶ配列
x = np.logspace(2.0, 4.0, num = 5)

# xの常用対数
y = np.log10(x)

print("x = {}".format(x))
print("y = {}".format(y))
x = [100.  316.22776602  1000.  3162.27766017  10000.]
y = [2.  2.5  3.  3.5  4.]

 endpoint を False に設定すると、stop を含まない形で配列を生成します。

# 10**2から、10を底とする対数スケールで要素が等間隔に5個並ぶ配列
x = np.logspace(2.0, 4.0, num = 5, endpoint = False)

# xの常用対数
y = np.log10(x)

print("x = {}".format(x))
print("y = {}".format(y))
x = [100.  251.18864315  630.95734448  1584.89319246  3981.07170553]
y = [2.  2.4  2.8  3.2  3.6]

 

numpy.diag()

 numpy.diag() は対角配列を生成、もしくは配列の対角成分を抜き出す関数です。

 numpy.diag(v, k=0)

 第1引数 v に 1次元配列を渡すと、渡した配列を右斜めの対角要素とする(それ以外の要素を 0 とする)2次元配列を返します。第2引数 k でオフセットを指定することができます(正ならば列方向、負ならば行方向にずらします)。

# 対角成分
v = np.array([1, 2, 3])

# 対角配列を作成
x1 = np.diag(v)
x2 = np.diag(v, 2)
x3 = np.diag(v, -2)

print("{}\n".format(x1))
print("{}\n".format(x2))
print("{}".format(x3))
[[1 0 0]
 [0 2 0]
 [0 0 3]]
 
[[0 0 1 0 0]
 [0 0 0 2 0]
 [0 0 0 0 3]
 [0 0 0 0 0]
 [0 0 0 0 0]]
 
[[0 0 0 0 0]
 [0 0 0 0 0]
 [1 0 0 0 0]
 [0 2 0 0 0]
 [0 0 3 0 0]]

 
 第1引数 v に 2次元配列を渡すと、配列から右斜めの対角線に並ぶ要素を抜き出して 1次元配列として返します。第2引数 k はオフセットです。

# 配列xを定義
x = np.array([[1, 2, 3],
              [4, 5, 6],
              [7, 8, 9]])

# xの対角成分を抽出
v1 = np.diag(x)
v2 = np.diag(x, 1)
v3 = np.diag(x, -1)

print("v1 = {}".format(v1))
print("v2 = {}".format(v2))
print("v3 = {}".format(v3))
v1 = [1 5 9]
v2 = [2 6]
v3 = [4 8]

 

numpy.fromfunction()

 numpy.fromfunction() は、第1引数に渡した関数を使って配列を生成します。

 numpy.fromfunction(function, shape, **kwargs)

 たとえば、2変数 i と j の関数を渡すと、2次元配列におけるインデックス (i, j) の要素をその関数にしたがって決定することになります。

# インデックス(i,j)の要素がi+jとなる配列を生成
x = np.fromfunction(lambda i, j: i + j, (3, 4), dtype = np.int)

print(x)
[[0 1 2 3]
 [1 2 3 4]
 [2 3 4 5]]

 
 3変数 i, j, k の関数を渡すと、3次元配列を生成します。

# インデックス(i,j,k)の要素がi*j+kとなる配列を生成
x = np.fromfunction(lambda i, j, k: i * j + k, (2, 3, 4), dtype = np.int)

print(x)
[[[0 1 2 3]
  [0 1 2 3]
  [0 1 2 3]]
 
 [[0 1 2 3]
  [1 2 3 4]
  [2 3 4 5]]]