スタック、Vスタック、Hスタック、連結、PythonのNumpy
Pythonのnumpyライブラリにnp.stack()という関数がありますが、いくつかのブログ記事を読んであまりに複雑だったので、ある程度理解してから簡単な解説を作りました。
np.スタック
まず、stack関数は配列を積み重ねるために使用され、以下のように呼び出されます。
np.stack(arrays,axis=0)
ここで,arrays は積み重ねる配列,axis は積み重ねるときに使用する軸,例.
arrays = [[1,2,3,4], [5,6,7,8] ]。
これは2次元の配列で、axis=0は1次元を意味し、すなわちarrays[0] = [1,2,3,4]、arrays[1] = [5,6,7,8] となります。
axis=i は、積み重ねの際に i 番目の次元が最初に選択され、パッキングされることを意味します。
具体的な例
np.stack(arrays, axis=0)を実行すると、最初の次元1, 2, 3, 4を取り出してパックし、[1, 2, 3, 4]、残りも同様にして、以下のような結果になります。
>>> arrays = [[1,2,3,4], [5,6,7,8]]
>>> arrays = np.array(arrays)
>>> np.stack(arrays,axis=0)
array([[1, 2, 3, 4],
[5, 6, 7, 8]])
np.stack(arrays, axis=1) を実行すると,配列の2次元目が先に "packed"され,つまり,1と5が [1, 5] に詰められ,あとは同様で,次のようになります.
>>> np.stack(arrays, axis=1)
array([[1, 5],
[2, 6],
[3, 7],
[4, 8]])
このパッキングという概念を使えば、たとえば3次元の配列の積み重ねを理解するのは難しいことではありません。
a = np.array([[1,2,3,4]], [5,6,7,8]])
arrays = np.asarray([a, a , a])
>>> arrays
array([[1, 2, 3, 4],
[5, 6, 7, 8]],
[[1, 2, 3, 4],
[5, 6, 7, 8]],
[[1, 2, 3, 4],
[5, 6, 7, 8]]])
np.stack(arrays, axis=0)を実行、つまり1次元目のパッキングを行うと、以下のようになります。
>>> np.stack(arrays, axis=0)
array([[1, 2, 3, 4],
[5, 6, 7, 8]],
[[1, 2, 3, 4],
[5, 6, 7, 8]],
[[1, 2, 3, 4],
[5, 6, 7, 8]]])
np.stack(arrays, axis=1) を実行、つまり、2次元目の要素 [1,2,3,4], [1,2,3,4], [1,2,3,4] を取り出して pack, [[1,2,3,4], [1,2,3,4]], [1,2,3,4]], 残りについても同じようにして、結果は以下の通りです。
>>> np.stack(arrays, axis=1)
array([[1, 2, 3, 4],
[1, 2, 3, 4],
[1, 2, 3, 4]],
[[5, 6, 7, 8],
[5, 6, 7, 8],
[5, 6, 7, 8]]])
先ほどと同様に np.stack(arrays, axis=2) を実行すると、3次元の要素 1, 1, 1 が取り出され、 [1,1,1] がパックされ、以下のような結果になります。
>>> np.stack(arrays, axis=2)
array([[1, 1, 1],
[2, 2, 2],
[3, 3, 3],
[4, 4, 4]],
[[5, 5, 5],
[6, 6, 6],
[7, 7, 7],
[8, 8, 8]]]])
要約すると、arrayは積み重ねる配列で、axisはどの次元の配列を結合するか(つまり本文中の"pack")を制御するものです。
np.concatenate
np.concatenate((a1,a2,a3,...) , axis=0), この関数は、特定の方向の軸に従ってステッチされ、デフォルトは1次元です、numpy公式サイトの例は次のとおりです。
>>> a = np.array([[1, 2], [3, 4]])
>>> b = np.array([[5, 6]])
>>> np.concatenate((a, b), axis=0)
array([[1, 2],
[3, 4],
[5, 6]])
>>> np.concatenate((a, b.T), axis=1)
array([[1, 2, 5],
[3, 4, 6]])
axis=0のとき、bの要素はaの最後に追加されます。ここでわかりにくいのは、2番目のnp.concatenate((a, b.T), axis=1)で、実は似ていてb.Tの形状は(1, 2), axis=1、そしてbの各要素はaの2次元に追加されます。そこで、axis=iとすると入力パラメータ (a1, a2,a3..) i番目の次元を除く全ての次元に対して例えば同じ形状でなければなりません。
>>> a = np.array([[1,2,3],[4,5,6]],[[1,2,3],[4,5,6]]])
>>> b = np.array([[1,2,3],[4,5,6]]])
>>> np.concatenate((a, b), axis=0)
array([[1, 2, 3],
[4, 5, 6]],
[[1, 2, 3],
[4, 5, 6]],
[[1, 2, 3],
[4, 5, 6]]])
ここで、a の形状は (2, 2, 3)、b の形状は (1, 2, 3) である。axis=0 では、他の 2 次元で a,b の形状が同じでなければならず、他の次元で直接連結操作を行うとエラーになる(axis=1 では、1次元の a,b の長さは同じではないのだから)。
>>> np.concatenate((a, b), axis=1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: all the input array dimensions except for the concatenation axis must match exactly
>>> np.concatenate((a, b), axis=2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: all the input array dimensions except for the concatenation axis must match exactly
これを説明する例として、次のようなものがあります。
>>> c=np.array([[5,6,7],[7,8,9]],[[4,5,6],[5,6,7]]])
>>> c
array([[5, 6, 7],
[7, 8, 9]],
[[4, 5, 6],
[5, 6, 7]]])
>>> c.shape
(2, 2, 3)
>>> np.concatenate((a, c), axis=1)
array([[1, 2, 3],
[4, 5, 6],
[5, 6, 7],
[7, 8, 9]],
[[1, 2, 3],
[4, 5, 6],
[4, 5, 6],
[5, 6, 7]]])
>>> np.concatenate((a, c), axis=2)
array([[1, 2, 3, 5, 6, 7],
[4, 5, 6, 7, 8, 9]],
[[1, 2, 3, 4, 5, 6],
[4, 5, 6, 5, 6, 7]]])
np.hstack
np.hstack(tup), 列の方向に積み重ねる, tupは以下のようになります。 tups, lists, or numpy arrays, which is actually axis=1, i'e.
np.hstack(tup) = np.concatenate(tup、axis=1)
上記のconcatenateの理解に従って、次の例を理解するのは簡単です。
>>> a = np.array((1,2,3))
>>> b = np.array((2,3,4))
>>> np.hstack((a,b))
array([1, 2, 3, 2, 3, 4])
>>> a = np.array([[1],[2],[3]])
>>> b = np.array([[2],[3],[4]])
>>> np.hstack((a,b))
array([[1, 2],
[2, 3],
[3, 4]])
np.vstack
np.vstack(tup), 行の方向に積み重ねる, tupは以下のようになります。 タプル、リスト、またはnumpy配列(上記と同様
np.vstack(tup) = (タプ)
<スパン
np.concatenate(tup、axis=0)
>>> a = np.array([1, 2, 3])
>>> b = np.array([2, 3, 4])
>>> np.vstack((a,b))
array([[1, 2, 3],
[2, 3, 4]])
>>> a = np.array([[1], [2], [3]])
>>> b = np.array([[2], [3], [4]])
>>> np.vstack((a,b))
array([[1],
[2],
[3],
[2],
[3],
[4]])
>>> a = np.array((1,2,3))
>>> b = np.array((2,3,4))
>>> np.dstack((a,b))
array([[1, 2],
[2, 3],
[3, 4]]])
>>> a = np.array([[1],[2],[3]])
>>> b = np.array([[2],[3],[4]])
>>> np.dstack((a,b))
array([[1, 2]],
[[2, 3]],
[[3, 4]]])
2番目のコードでは、aの1次元目の要素は[1], [2], [3]なので、bの対応する要素は直接スタックに追加されます。
np.dstack
np.dstack(tup), 3次元に積み重ねたもの, つまり
np.dstack(tup) = (タプ)
<スパン
np.concatenate(tup, axis=2)の方がわかりやすいので、公式の例で紹介することにします。
>>> a = np.array((1,2,3))
>>> b = np.array((2,3,4))
>>> np.column_stack((a,b))
array([[1, 2],
[2, 3],
[3, 4]])
>>> np.row_stack([np.array([1, 2, 3]), np.array([4, 5, 6])])
array([[1, 2, 3],
[4, 5, 6]])
>>> a = np.array([[1],[2],[3]])
>>> b = np.array([[2],[3],[4]])
>>> np.dstack((a,b))
array([[1, 2]],
[[2, 3]],
[[3, 4]]])
np.column_stackと np.row_stack
np.column_stack 関数は、1 次元配列を列方向に 2 次元配列に積み重ねる関数です。
np.row_stack関数は、1次元配列を2次元配列に積み重ね、行単位で配置します。
実はこの2つは、先のことを理解すれば比較的簡単なことなのです
>>> a = np.array((1,2,3))
>>> b = np.array((2,3,4))
>>> np.column_stack((a,b))
array([[1, 2],
[2, 3],
[3, 4]])
>>> np.row_stack([np.array([1, 2, 3]), np.array([4, 5, 6])])
array([[1, 2, 3],
[4, 5, 6]])
概要
実際には、2つの操作は、スタックとconcatenate、ここでスタックは、軸の軸の要素を見つけるために、次に結合し、新しい配列を形成する軸の要素を、concatenate軸に展開することですが、されますa1、a2、a3 ... axisで指定した軸に応じて操作を追加します...です。
関連
-
[解決済み】ImportError: PILという名前のモジュールがない
-
[解決済み】TypeErrorの修正方法。Unicode-オブジェクトはハッシュ化する前にエンコードする必要があります。
-
[解決済み] numpy.random.multivariate_normal(mean, cov[, size]) を用いて複数サンプルを描画する。
-
[解決済み] OSError: Pandas の csv でファイルからの初期化に失敗しました。
-
[解決済み] TypeError: unsupported operand type(s) for +: 'NoneType' and 'str'」を修正するにはどうしたらいいですか?
-
[解決済み] TypeError: 'Tensor'オブジェクトはTensorFlowのアイテム割り当てをサポートしていません。
-
[解決済み] UnicodeEncodeError: 'ascii' codec can't encode character u'\xa0' in position 20: ordinal not in range(128)
-
[解決済み] SqlAlchemy Python マルチデータベース
-
Pythonビギナーエラーです。TypeError: サポートされていないオペランドタイプ(複数可) for +: 'int' および 'str'
-
デバイスに不適切な ioctl がある (解決予定)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】ValueError: 新しい配列の合計サイズは変更されない必要があります。
-
python TypeError: Unicode オブジェクトはハッシュ化する前にエンコードする必要がある 解決策
-
Flaskのエラー「TypeError.Flask」を解決する。ユニコードオブジェクトはハッシュ化する前にエンコードする必要があります"
-
[解決済み] TypeError: 型 'NoneType' の引数は反復可能ではありません。
-
[解決済み] シーボーンプロットでsns.setを使用する場合
-
[解決済み] Bokeh HoverToolに"?"が表示される。
-
[解決済み] AttributeError: 'unicode' オブジェクトには XXX という属性がありません。
-
[解決済み] Python subprocess.Popen() 完了待ち [重複]。
-
[解決済み] Numpy.dot TypeError: ルール 'safe' に従って配列データを dtype('float64') から dtype('S32') にキャストできません。
-
要件ファイルを開くことができませんでした。[Errno 2] そのようなファイルまたはディレクトリはありません。/requirements.txt エラー解決