はじめに
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.blockを使う
このような場合、とりあえず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はとても便利なので、配列の複雑な連結が必要になった際には、ぜひ使ってみてください。