numpy – 配列を結合する関数について

目次

概要

numpy の配列を結合する関数について解説します。

一覧

名前 説明 numpy.fmod()
numpy.r_ 配列を指定した方式で結合する。 x1 = numpy.true_div(x1, x2) * x2 + numpy.fix(x1, x2)
numpy.c_ 配列を axis=-1 方向に結合する。 C、C++、Java、Javascript
numpy.vstack 配列を axis=0 方向に結合する。
numpy.hstack 配列を axis=1 方向に結合する。
numpy.dstack 配列を axis=2 方向に結合する。
numpy.stack 配列に軸を追加し、その軸で結合する。
numpy.column_stack 配列を axis=1 方向に結合する。
numpy.concatenate 配列を指定した axis 方向に結合する。
numpy.block 配列をブロック状に結合する。

numpy.r_

カンマ区切りで指定した配列を指定した方式で結合します。

numpy.r_[array1, array2, ..., arrayn]

配列をカンマ区切りで指定する

配列をカンマ区切りで指定した場合、axis=0 に沿って結合します。

numpy.r_

In [1]:
import numpy as np

a = np.array([1, 2, 3])
b = np.array([4, 5, 6])

# axis=0 に沿って結合する。
c = np.r_[a, b]
print(c)
[1 2 3 4 5 6]

numpy.r_

In [2]:
a = np.array([[1, 2],
              [3, 4]])
b = np.array([[5, 6],
              [8, 9]])

# axis=0 に沿って結合する。
c = np.r_[a, b]
print(c)
[[1 2]
 [3 4]
 [5 6]
 [8 9]]

start:stop:step を使用する

numpy.r_[array1, array2, ..., arrayn] に指定する array は、配列の代わりに start:stop:step 記法を使用できます。

  • numpy.r_[start:stop:step] とした場合、np.arange(start, stop, step) が生成する配列となります。
  • numpy.r_[start:stop:stepj] とした場合、np.linspace(start, stop, step, endpoint=True) が生成する配列となります。
In [3]:
a = np.array([1, 2, 3])

print(np.r_[a, :5])  # np.r_[a, np.arange(5)] と同じ
print(np.r_[a, 5:10])  # np.r_[a, np.arange(5, 10)] と同じ
print(np.r_[a, 5:10:2])  # np.r_[a, np.arange(5, 10, 2)] と同じ

print(np.r_[a, 5:10:5j]) # np.r_[a, np.linspace(5, 10, 5)] と同じ
[1 2 3 0 1 2 3 4]
[1 2 3 5 6 7 8 9]
[1 2 3 5 7 9]
[ 1.    2.    3.    5.    6.25  7.5   8.75 10.  ]

結合方法を指定する

numpy.r_['a,b,c', array1, array2, ..., arrayn] のように最初に文字列 "a,b,c" を指定することで結合方法を指定できます。

  • a: 結合する方向を指定します。
  • b: 次元数が b 未満の場合、結合前にサイズ1の次元を挿入して、次元数を b にします。(デフォルトは0)
  • c: 次元数が b 未満の場合、元の配列 axis=0 が axis=c の位置にくるようサイズ1の次元を挿入します。(デフォルトは0、つまり axis=-1 に次元を挿入します。)
  • “a, b, c” は “a” や “a,b” のように省略可能です。その場合、省略したものはデフォルトの値が使われます。

a だけ指定する

numpy.r_

In [4]:
a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6], [8, 9]])

# axis=0 に沿って結合する。
c = np.r_["0", a, b]
print(c)
[[1 2]
 [3 4]
 [5 6]
 [8 9]]

numpy.r_

In [5]:
a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6], [8, 9]])

# axis=1 に沿って結合する。
c = np.r_["1", a, b]
print(c)

# axis=-1 (a.k.a axis=1) に沿って結合する。
c = np.r_["-1", a, b]
print(c)
[[1 2 5 6]
 [3 4 8 9]]
[[1 2 5 6]
 [3 4 8 9]]

a,b だけ指定する

In [6]:
a = np.array([1, 2])
b = np.array([[5, 6],
              [8, 9]])

# a は2次元未満なので、サイズ1の次元を挿入して2次元にする。
# c は指定されていないので、デフォルト0であり、元の配列の axis=0 の軸の位置が次元を
# 挿入後に axis=0 となるようにサイズ1の次元を挿入する。
# よって、(2,) -> (1, 2) と形式が変更される。
# その上で、a, b を axis=0 に沿って結合する。
c = np.r_['0,2', a, b]
print(c)
[[1 2]
 [5 6]
 [8 9]]

a,b,c を指定する

In [7]:
a = np.array([1, 2])
b = np.array([[5, 6],
              [8, 9]])

# a は2次元未満なので、サイズ1の次元を挿入して2次元にする。
# 元の配列の axis=0 の軸の位置が次元を挿入後に axis=2 となるようにサイズ1の次元を挿入する。
# よって、(2,) -> (2, 1) と形式が変更される。
# その上で、a, b を axis=1 に沿って結合する。
c = np.r_['1,2,0', a, b]
print(c)
[[1 5 6]
 [2 8 9]]

numpy.c_

カンマ区切りで指定した配列を axis=-1 方向で結合します。np.r_['-1,2,0', array1, array2, ..., arrayn] と同じです。

numpy.c_[array1, array2, ..., arrayn]
In [8]:
a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6], [8, 9]])

# axis=-1 (a.k.a axis=1) 方向で結合する。
c = np.c_[a, b]
print(c)

# 以下と一緒
c = np.r_["-1,2,0", a, b]
print(c)
[[1 2 5 6]
 [3 4 8 9]]
[[1 2 5 6]
 [3 4 8 9]]
In [9]:
a = np.array([1, 2])
b = np.array([[5, 6], [8, 9]])

# a は2次元未満なので、サイズ1の次元を挿入して2次元にする。
# 元の配列の axis=0 の軸の位置が次元を挿入後に axis=0 となるようにサイズ1の次元を挿入する。
# よって、(2,) -> (2, 1) と形式が変更される。
# その上で、a, b を axis=-1 (a.k.a axis=1) 方向で結合する。
c = np.c_[a, b]
print(c)

# 以下と一緒
c = np.r_["-1,2,0", a, b]
print(c)
[[1 5 6]
 [2 8 9]]
[[1 5 6]
 [2 8 9]]

numpy.vstack

指定した配列を axis=0 方向で結合します。

  • 1次元配列の場合は、結合前に (1, N) に形状を変更します。
  • 配列の形状は、axis=0 以外は同じでなければなりません。

a.shape=(2, 3), b.shape=(4, 3) の場合

axis=1a, b ともに 3 なのでOK axis=0 方向に結合し、(6, 3) となる。

a.shape=(2, 3), b.shape=(3,) の場合 b は1次元配列なので、b.shape=(1, 3) と形状が変更される。 すると、axis=1a, b ともに3なのでOK axis=0 方向に結合し、(3, 3) となる。

numpy.vstack(tup)
引数
名前 デフォルト値
tup sequence of ndarrays
配列は、最初の軸以外のすべての軸に沿って同じ形をしていなければならない。1 次元の配列は、同じ長さでなければならない。
返り値
名前 説明
stacked 与えられた配列を積み重ねて形成される配列は、少なくとも2次元になります。
In [10]:
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])

# 結合前に a, b の形状は (3,) -> (1, 3) と変更される。
# axis=0 方向で結合する。
c = np.vstack([a, b])
print(c)

# 以下と一緒
c = np.r_["0,2,-1", a, b]
print(c)
[[1 2 3]
 [4 5 6]]
[[1 2 3]
 [4 5 6]]
In [11]:
a = np.array([[1], [2], [3]])  # a.shape=(3, 1)
b = np.array([[2], [3], [4]])  # b.shape=(3, 1)

# axis=0 方向で結合する。
c = np.vstack([a, b])  # c.shape=(6, 1)
print(c)

# 以下と一緒
c = np.r_["0,2,-1", a, b]
print(c)
[[1]
 [2]
 [3]
 [2]
 [3]
 [4]]
[[1]
 [2]
 [3]
 [2]
 [3]
 [4]]

numpy.hstack

  • すべて1次元配列の場合は axis=0 方向に結合する。
  • そうでない場合、指定した配列を axis=1 方向で結合する。
  • このとき、配列の形状は、axis=1 以外は同じでなければならない。

例 a.shape=(3,), b.shape=(5,) の場合

axis=0 方向に結合し、(8,) となる。

例 a.shape=(2, 1, 2), b.shape=(2, 1, 2) の場合

axis=1 以外 (axis=0, 2) は a, b ともに次元のサイズが一致するのでOK axis=1 方向に結合し、(2, 2, 2) となる。

numpy.hstack(tup)
引数
名前 デフォルト値
tup sequence of ndarrays
配列は、任意の長さの1次元配列を除いて、2番目の軸以外のすべての軸に沿って同じ形をしていなければいけません。
返り値
名前 説明
stacked 与えられた配列を積み重ねて形成される配列。
In [12]:
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])

# axis=0 方向で結合する。
c = np.hstack([a, b])
print(c)

# 以下と一緒
c = np.r_["0", a, b]
print(c)
[1 2 3 4 5 6]
[1 2 3 4 5 6]
In [13]:
a = np.array([[[1, 2]],
              [[3, 4]]])  # a.shape=(2, 1, 2)
b = np.array([[[5, 6]],
              [[8, 9]]])  # b.shape=(2, 1, 2)

# axis=1 方向で結合する。
c = np.hstack([a, b])  # c.shape=(2, 2, 2)
print(c)

# 以下と一緒
c = np.r_['1', a, b]
print(c)
[[[1 2]
  [5 6]]

 [[3 4]
  [8 9]]]
[[[1 2]
  [5 6]]

 [[3 4]
  [8 9]]]

numpy.dstack

1次元配列 (N,) の場合の場合は、結合前に (1, N, 1) と次元を拡張する。 2次元配列 (N, M) の場合は、結合前に (N, M, 1) と次元を拡張する。 指定した配列を axis=2 方向で結合する。 このとき、配列の形状は、axis=2 以外は同じでなければならない。

numpy.dstack(tup)
引数
名前 デフォルト値
tup sequence of arrays
配列は、3 番目の軸以外のすべての軸に沿って同じ形をしていなければいけません。1 次元または 2 次元の配列は、同じ形状をしていなければいけません。
返り値
名前 説明
stacked 与えられた配列を積み重ねてできた配列は、少なくとも3次元になります。

numpy.dstack()

In [14]:
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])

# a, b の形状は (3,) -> (1, 3, 1) と変更される。
# axis=2 方向で結合する。
c = np.dstack([a, b])
print(c)

# 以下と一緒
c = np.r_["2,3,1", a, b]
print(c)
[[[1 4]
  [2 5]
  [3 6]]]
[[[1 4]
  [2 5]
  [3 6]]]

numpy.stack

新しい軸に沿って配列の列を結合する。

numpy.stack(arrays, axis=0, out=None)
引数
名前 デフォルト値
arrays sequence of array_like
各配列は同じ形をしていなければならない。
axis int 0
入力された配列が積層された結果の配列の軸。
返り値
名前 説明
stacked スタックされた配列は、入力配列よりも1つ多い次元を持ちます。

サンプルコード

In [ ]:
a = np.random.randn(3, 4)
b = np.random.randn(3, 4)

# a, b の形状は (3, 4) -> (1, 3, 4) と変更される。
# その後、axis=0 方向で結合する。
c = np.stack([a, b], axis=0)
print(c.shape)  # (2, 3, 4)

# a, b の形状は (3, 4) -> (3, 1, 4) と変更される。
# その後、axis=1 方向で結合する。
c = np.stack([a, b], axis=1)
print(c.shape)  # (3, 2, 4)

# a, b の形状は (3, 4) -> (3, 4, 1) と変更される。
# その後、axis=1 方向で結合する。
c = np.stack([a, b], axis=2)
print(c.shape)  # (3, 4, 2)

numpy.column_stack

1 次元の配列を列として 2 次元の配列にスタックします。

numpy.column_stack(tup)
引数
名前 デフォルト値
tup sequence of 1-D, 2-D arrays.
スタックする配列。それらはすべて同じ1次元目を持たなければならない。
返り値
名前 説明
stacked 与えられた配列を積み重ねて形成される配列。

numpy.column_stack

In [15]:
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])

# 結合前に a, b の形状は (3,) -> (3, 1) と形状が変更される。
# axis=1 方向で結合する。
c = np.column_stack([a, b])
print(c)

# 以下と一緒
c = np.r_["-1,2,0", a, b]
print(c)
[[1 4]
 [2 5]
 [3 6]]
[[1 4]
 [2 5]
 [3 6]]
In [16]:
a = np.array([1, 2])
b = np.array([[5, 6], [8, 9]])

# 結合前に a の形状は (2,) -> (2, 1) と次元が追加される。
# axis=-1 方向で結合する。
c = np.column_stack([a, b])
print(c)

# 以下と一緒
c = np.r_["-1,2,0", a, b]
print(c)
[[1 5 6]
 [2 8 9]]
[[1 5 6]
 [2 8 9]]

numpy.concatenate

既存の軸に沿って配列の列を結合する。

numpy.concatenate((a1, a2, ...), axis=0, out=None)
引数
名前 デフォルト値
a1, a2, … sequence of array_like
配列は、axis (デフォルトでは1番目)に対応する次元を除いて、同じ形状でなければいけません。
axis int 0
配列が結合される軸。axis が None の場合、配列は使用前に平坦化されます。デフォルトは0です。
返り値
名前 説明
res 連結された配列。

サンプルコード

In [17]:
a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6], [8, 9]])

# axis=1 方向で結合する。
c = np.concatenate([a, b], axis=1)
print(c)

# 以下と一緒
c = np.r_["1", a, b]
print(c)
[[1 2 5 6]
 [3 4 8 9]]
[[1 2 5 6]
 [3 4 8 9]]

numpy.block

ブロックのネストしたリストから nd-array をアセンブルします。

numpy.block(arrays)
引数
名前 デフォルト値
arrays nested list of array_like, scalars (but not tuples)
単一のnd配列またはスカラ(深さ0のネストされたリスト)を渡した場合、これは変更されずに返されます(コピーされません)。
返り値
名前 説明

サンプルコード

In [18]:
A = np.eye(2) * 2
B = np.eye(3) * 3
np.block([[A, np.zeros((2, 3))], [np.ones((3, 2)), B]])
array([[2., 0., 0., 0., 0.],
       [0., 2., 0., 0., 0.],
       [1., 1., 3., 0., 0.],
       [1., 1., 0., 3., 0.],
       [1., 1., 0., 0., 3.]])

コメント

コメントする

目次