web-dev-qa-db-ja.com

3D行列を転置する方法は?

サイズx_testの3Dマトリックス(100, 33, 66)があり、そのサイズを(100, 66, 33)に変更したいと思います。

Python3.5を使用してこれを行う最も効率的な方法は何ですか?私はそれらの線に沿って何かを探します:

y = x_test.transpose()
9
Ajees

目的のディメンションを関数に渡すことができます _np.transpose_ あなたのケースではnp.transpose(x_test, (0, 2, 1))を使用します。

例えば、

_import numpy as np

x_test = np.arange(30).reshape(3, 2, 5)

print(x_test)
print(x_test.shape)
_

これは印刷されます

_[[[ 0  1  2  3  4]
  [ 5  6  7  8  9]]

 [[10 11 12 13 14]
  [15 16 17 18 19]]

 [[20 21 22 23 24]
  [25 26 27 28 29]]]
(3, 2, 5)
_

これで、上からのコマンドで行列を転置できます

_y = np.transpose(x_test, (0, 2, 1))
print(y)
print(y.shape)
_

与える

_[[[ 0  5]
  [ 1  6]
  [ 2  7]
  [ 3  8]
  [ 4  9]]

 [[10 15]
  [11 16]
  [12 17]
  [13 18]
  [14 19]]

 [[20 25]
  [21 26]
  [22 27]
  [23 28]
  [24 29]]]
(3, 5, 2)
_
13
Cleb

transpose(@Clebの回答を参照)の他に、swapaxesmoveaxisもあります。

import numpy as np
mock = np.arange(30).reshape(2,3,5)

mock.swapaxes(1,2)
# array([[[ 0,  5, 10],
    [ 1,  6, 11],
    [ 2,  7, 12],
    [ 3,  8, 13],
    [ 4,  9, 14]],

   [[15, 20, 25],
    [16, 21, 26],
    [17, 22, 27],
    [18, 23, 28],
    [19, 24, 29]]])
np.moveaxis(mock,2,1)
# array([[[ 0,  5, 10],
    [ 1,  6, 11],
    [ 2,  7, 12],
    [ 3,  8, 13],
    [ 4,  9, 14]],

   [[15, 20, 25],
    [16, 21, 26],
    [17, 22, 27],
    [18, 23, 28],
    [19, 24, 29]]])
5
Paul Panzer