1. ホーム
  2. python

[解決済み] 2つのNumPy配列を縦に連結する

2023-08-18 17:49:48

質問

以下を試してみました。

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

しかし、少なくとも1つの結果が次のようになることを期待したい。

array([[1, 2, 3],
       [4, 5, 6]])

なぜ縦に連結されないのか?

どのように解決するのですか?

なぜなら ab は軸が1つしかないため、形状が (3) であり、axisパラメータは特に連結する要素の軸を参照します。

この例では concatenate が軸で何をしているのかが分かるでしょう。2つの軸を持つ2つのベクトルを取り、形状を (2,3) :

a = np.array([[1,5,9], [2,6,10]])
b = np.array([[3,7,11], [4,8,12]])

は1番目の軸に沿って連結します(1番目の行、次に2番目の行)。

np.concatenate((a,b), axis=0)
array([[ 1,  5,  9],
       [ 2,  6, 10],
       [ 3,  7, 11],
       [ 4,  8, 12]])

は第2軸に沿って連結します(第1軸の列、第2軸の列)。

np.concatenate((a, b), axis=1)
array([[ 1,  5,  9,  3,  7, 11],
       [ 2,  6, 10,  4,  8, 12]])

で、提示したような出力を得るためには vstack

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

を使っても concatenate でもできますが、最初に形を変える必要があります。

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

最後に、コメントで提案されているように、形を変える一つの方法として newaxis :

np.concatenate((a[np.newaxis,:], b[np.newaxis,:]))