web-dev-qa-db-ja.com

2つのNumPy配列を垂直に連結します

私は次を試しました:

>>> 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]])

なぜ垂直に連結されないのですか?

59
toom

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

この例では、concatenateが軸で何をしているのかを明確にする必要があります。形状(2,3)を使用して、2つの軸を持つ2つのベクトルを取得します。

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]])

最後に、コメントで提案されているように、それらを再形成する1つの方法はnewaxisを使用することです。

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

目前の実際の問題が2つの1-D配列を垂直に連結することであり、concatenateを使用してこの操作を実行することに固執しない場合、np。 column_stack

In []: a = np.array([1,2,3])
In []: b = np.array([4,5,6])
In []: np.column_stack((a, b))
array([[1, 4],
       [2, 5],
       [3, 6]])
20
Kshitij Saraogi

Numpyのあまり知られていない機能は、r_を使用することです。これは、配列をすばやく構築する簡単な方法です。

import numpy as np
a = np.array([1,2,3])
b = np.array([4,5,6])
c = np.r_[a[None,:],b[None,:]]
print(c)
#[[1 2 3]
# [4 5 6]]

a[None,:]の目的は、配列aに軸を追加することです。

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

同様に動作します

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

リストのリストであるか1D配列のリストであるかにかかわらず、np.arrayは2D配列を作成しようとします。

しかし、np.concatenateとそのstack関数のファミリーがどのように機能するかを理解することも良い考えです。このコンテキストでは、concatenateは入力として2D配列のリスト(またはnp.arrayが2D配列に変換するもの)を必要とします。

np.vstackは最初に入力をループし、少なくとも2Dであることを確認してから、連結します。機能的には、配列の次元を自分で拡張するのと同じです。

np.stackは、新しい次元で配列を結合する新しい関数です。デフォルトはnp.arrayと同じように動作します。

これらの関数のコードを見てください。 Pythonで書かれていれば、かなり学ぶことができます。 vstackの場合:

return _nx.concatenate([atleast_2d(_m) for _m in tup], 0)
5
hpaulj