静かなる名辞

pythonとプログラミングのこと



【python】numpy配列の複雑な連結にはnp.blockが便利

 numpy配列を連結したいとき、通常np.vstackやnp.hstack、np.concatenateなどを使うと思います。

 しかし、これらでは一度で表せないような連結をしたいときがあります。たとえば、2次元配列を平面的に連結するような場合です。

>>> import numpy as np
>>> a = np.array([[0,1],[2,3]])
>>> b = np.array([[4,5],[6,7]])
>>> c = np.array([[8,9],[10,11]])
>>> d = np.array([[12,13],[14,15]])
""" 下のようにしたい
array([[ 0,  1,  4,  5],
       [ 2,  3,  6,  7],
       [ 8,  9, 12, 13],
       [10, 11, 14, 15]])
"""

 この例のように、複数のaxisにまたがって連結をしたい場合、上に挙げた関数ではうまくいきません。このような場合、とりあえずnp.vstackで縦方向に連結してからnp.hstackで横方向に連結する(あるいは逆の順番でも可)というのが一つの方法ですが、ちょっとややこしいですね。

>>> np.vstack([np.hstack([a,b]), np.hstack([c,d])])  # たいへん
array([[ 0,  1,  4,  5],
       [ 2,  3,  6,  7],
       [ 8,  9, 12, 13],
       [10, 11, 14, 15]])

 こういうとき、np.blockを使うと配列の連結を簡単に行なえます。

>>> np.block([[a,b],[c,d]])
array([[ 0,  1,  4,  5],
       [ 2,  3,  6,  7],
       [ 8,  9, 12, 13],
       [10, 11, 14, 15]])

 すごいですね。直感的に配列の連結が書けます。

 直感的なのは良いけど、具体的にどんな仕様なの? という疑問が浮かびますが、

Blocks in the innermost lists are concatenated (see concatenate) along the last dimension (-1), then these are concatenated along the second-last dimension (-2), and so on until the outermost list is reached.

numpy.block — NumPy v1.14 Manual

 という仕様になっているようです。リストの外に達するまで-1, -2, ...のdimension(=axisかな)でconcatenateされる。

 このようにnp.blockはとても便利なので、配列の複雑な連結が必要になった際には、ぜひ使ってみてください。

追記

 こんな記事を作ったので、こちらもあわせて御覧ください。

www.haya-programming.com