私は次を試しました:
>>> 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]])
なぜ垂直に連結されないのですか?
a
とb
の両方が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,:]))
目前の実際の問題が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]])
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
に軸を追加することです。
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)