1. ホーム
  2. python

[解決済み] numpyのdstack関数の理解

2022-03-12 15:26:56

質問

numpy の dstack 関数が実際に行っていることです。ドキュメントはかなりまばらで、ただこう書いてあるだけです。

配列を深さ方向(3軸方向)に順番に積み重ねます。

配列のシーケンスを取り、第3軸に沿って積み重ねます。 で1つの配列にします。で割った配列を再構築します。 dsplit . これは、2次元の配列(画像)を積み重ねて1つの配列にする簡単な方法です。 3次元配列で処理します。

私が本当にバカで、この意味が明白なのか、それとも「積み重ねる」「順番に」「深さ方向に」「軸に沿って」という言葉について何か誤解しているようなのです。しかし、私はこれらの用語を、以下の文脈で理解したような印象を受けました。 vstackhstack でいいんです。

この例で考えてみましょう。

In [193]: a
Out[193]: 
array([[0, 3],
       [1, 4],
       [2, 5]])
In [194]: b
Out[194]: 
array([[ 6,  9],
       [ 7, 10],
       [ 8, 11]])
In [195]: dstack([a,b])
Out[195]: 
array([[[ 0,  6],
        [ 3,  9]],

       [[ 1,  7],
        [ 4, 10]],

       [[ 2,  8],
        [ 5, 11]]])

まず最初に ab は第3軸を持たないので、どのように''軸''に沿って積み重ねるのでしょうか? その そもそも「第三の軸」とは?次に、仮に ab は2次元イメージの表現なのに、どうして さん 2つの2D配列が「順番に」並んでいるのに対して、2D配列が結果的に並んでいるのですか?

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

を理解するのは簡単です。 np.vstack , np.hstacknp.dstack * を見ることで行う。 .shape 属性が出力されます。

2つの配列の例を使って

print(a.shape, b.shape)
# (3, 2) (3, 2)

  • np.vstack は1次元に沿って連結される...

    print(np.vstack((a, b)).shape)
    # (6, 2)
    
    
  • np.hstack は2次元に沿って連結される...

    print(np.hstack((a, b)).shape)
    # (3, 4)
    
    
  • そして np.dstack は、3次元に沿って連結される。

    print(np.dstack((a, b)).shape)
    # (3, 2, 2)
    
    

以降 ab はどちらも2次元です。 np.dstack は、サイズ1の3次元を挿入することにより、それらを拡張する。これは,3次元のインデックスを作るために np.newaxis (またはその代わりに None ) のようなものです。

print(a[:, :, np.newaxis].shape)
# (3, 2, 1)

もし c = np.dstack((a, b)) であれば c[:, :, 0] == ac[:, :, 1] == b .

同じ操作をより明示的に行うには、次のようにします。 np.concatenate このように

print(np.concatenate((a[..., None], b[..., None]), axis=2).shape)
# (3, 2, 2)


* モジュールの全内容をグローバルネームスペースにインポートするには、以下の方法を使用します。 import * いくつかの理由から、バッドプラクティスと考えられています。 . 慣用的な方法としては import numpy as np .