6

aPythonのリストにしましょう。

a = [1,2,3]

に行列転置を適用するとa、次のようになります。

np.matrix(a).transpose()
matrix([[1],
        [2],
        [3]])

私はこの機能を一般化することを目指しており、次に例を使って何をしようとしているのかを説明します。b別のリストにしましょう。

b = [[1, 2], [2, 3], [3, 4]]

では、リスト アイテムは 1、2、および 3です。転置を実行する目的でのみ、、、およびを のリスト アイテムとa見なしたいと思います。出力を次のようにしたいと思います。[1,2][2,3][3,4]b

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

一般に、リスト項目がどのように見えるかを指定し、それに基づいて行列の転置を実行できるようにしたいと考えています。

上記を実行するために数行のコードを書くこともできますが、この質問をする目的は、これを行うための組み込みの numpy 機能または pythonic の方法があるかどうかを調べることです。

編集: 以下の unutbu の出力は、上記の出力と一致します。ただし、より一般的なケースで機能するソリューションが必要でした。以下に別の入力/出力を投稿しました。私の最初の例は、私が言いたいことを伝えるのに十分な説明ではありませんでした. のアイテムをb[1,2][2,3][3,4]および とし[5,6]ます。次に、以下に示す出力は、高次元の要素で行列転置を行ったものになります。より一般的には、「アイテム」がどのように見えるかを説明したら、転置のようなことを行う方法があるかどうかを知りたいと思います。

Input: b = [[[1, 2], [2, 3]], [[3, 4], [5,6]]]
Output: array([[[1,2], [3,4]],
               [[2,3], [5,6]]])
4

1 に答える 1

7

目的の配列の形状は (3,1,2) です。bは (3,2) の形をしています。追加の軸を真ん中に貼り付けるにはb[:,None,:]、 または (同等)を使用しb[:, np.newaxis, :]ます。Basic Slicingのセクションで「newaxis」を探します。

In [178]: b = np.array([[1, 2], [2, 3], [3, 4]])

In [179]: b
Out[179]: 
array([[1, 2],
       [2, 3],
       [3, 4]])

In [202]: b[:,None,:]
Out[202]: 
array([[[1, 2]],

       [[2, 3]],

       [[3, 4]]])

別の便利なツールはnp.swapaxesです:

In [222]: b = np.array([[[1, 2], [2, 3]], [[3, 4], [5,6]]])

In [223]: b.swapaxes(0,1)
Out[223]: 
array([[[1, 2],
        [3, 4]],

       [[2, 3],
        [5, 6]]])

転置b.Tは、最初と最後の軸を入れ替えることと同じですb.swapaxes(0,-1)

In [226]: b.T
Out[226]: 
array([[[1, 3],
        [2, 5]],

       [[2, 4],
        [3, 6]]])

In [227]: b.swapaxes(0,-1)
Out[227]: 
array([[[1, 3],
        [2, 5]],

       [[2, 4],
        [3, 6]]])

概要:

  • np.newaxis (または) を使用Noneして、新しい軸を追加します。(したがって、配列の次元を増やします)
  • np.swapaxesを使用して、任意の 2 つの軸を交換します。
  • np.transposeを使用して、すべての軸を一度に並べ替えます。(これを指摘してくれた@jorgecaに感謝します。)
  • np.rollaxisを使用して、軸を「回転」させます。
于 2013-03-18T17:39:02.350 に答える