Python: трехмерный тензор от основного столбца к главному ряду - PullRequest
0 голосов
/ 22 мая 2018

Я использую scipy.io для чтения файла Mat в python, загружая 3D-тензор.В большинстве ссылок, которые я нахожу в Интернете, обсуждаются только 2 измерения, и у меня возникают трудности, когда я оборачиваюсь головой от основного столбца к главному в строке данных с измерениями больше 2.

  1. Поддерживает ли scipy.io преобразование из столбцаMajor (order = 'F') для автоматической генерации строки Major (order = 'C')?
  2. , если не 1, есть ли лучший способ изменить 3D-тензор, чем использование комбинации ravel и reshape с order?
  3. если не 2, есть ли способ программно определить форму, которой должен быть преобразованный тензор?В приведенном ниже примере я использую unravel и reshape, но ясно, что исходная форма не подходит?

ПРИМЕР

В этом примере, скажем, у меня есть (2, 4, 3) размерная матрица, которая была прочитана в Column-Major, и яхочу поменять его на Роу-мажор.

import numpy as np

lst3d = [[[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11]], [[13, 14, 15], [17, 18, 19], [21, 22, 23], [25, 26, 27]]]

print(lst3d)
a = np.array(lst3d)
b = np.array(lst3d)

print(a.shape)
print('----------')
print(a.ravel(order='C').reshape(a.shape))
print('----------')
print(b.ravel(order='F').reshape(b.shape))

выходные данные:

[[[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11]], [[13, 14, 15], [17, 18, 19], [21, 22, 23], [25, 26, 27]]]
(2, 4, 3)
----------
[[[ 0  1  2]
  [ 3  4  5]
  [ 6  7  8]
  [ 9 10 11]]

 [[13 14 15]
  [17 18 19]
  [21 22 23]
  [25 26 27]]]
----------
[[[ 0 13  3]
  [17  6 21]
  [ 9 25  1]
  [14  4 18]]

 [[ 7 22 10]
  [26  2 15]
  [ 5 19  8]
  [23 11 27]]]

СВЯЗАННЫЕ

1 Ответ

0 голосов
/ 22 мая 2018

В Октаве:

>> x=0:23;
>> x=reshape(x,2,4,3);
>> x
x =
ans(:,:,1) =
   0   2   4   6
   1   3   5   7
ans(:,:,2) =
    8   10   12   14
    9   11   13   15
ans(:,:,3) =
   16   18   20   22
   17   19   21   23
>> save -v7 test3d x

В ipython:

In [192]: data = io.loadmat('test3d')
In [194]: x=data['x']
In [195]: x
Out[195]: 
array([[[ 0.,  8., 16.],
        [ 2., 10., 18.],
        [ 4., 12., 20.],
        [ 6., 14., 22.]],

       [[ 1.,  9., 17.],
        [ 3., 11., 19.],
        [ 5., 13., 21.],
        [ 7., 15., 23.]]])
In [196]: x.shape
Out[196]: (2, 4, 3)

Отображается как в Октаве:

In [197]: x[:,:,0]
Out[197]: 
array([[0., 2., 4., 6.],
       [1., 3., 5., 7.]])

loadmat загрузил его как F заказ, с той же формой 2,4,3.А справа ravel производит исходные числа 0:23:

In [200]: x.ravel(order='F')
Out[200]: 
array([ 0.,  1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9., 10., 11., 12.,
       13., 14., 15., 16., 17., 18., 19., 20., 21., 22., 23.])

Транспонирование x создает массив 'C' (3,4,2) порядка:

In [207]: x.T[0]
Out[207]: 
array([[0., 1.],
       [2., 3.],
       [4., 5.],
       [6., 7.]])
In [208]: y=np.arange(24).reshape(3,4,2)
In [209]: y[0]
Out[209]: 
array([[0, 1],
       [2, 3],
       [4, 5],
       [6, 7]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...