Почему результат печати трехмерных массивов отличается от ментальной визуализации того же самого в python? - PullRequest
2 голосов
/ 12 октября 2019

Я изучаю машинное обучение, и у меня нет большого опыта программирования. Пытаясь понять трехмерные массивы, я получил указание визуализировать массив 2x4x3 следующим образом: 2x4x3

Но когда я создаю случайный массив такой же формы, используя:

X = np.random.randint(10, size=(2, 4, 3))
print(X)

вывод

[[[6 1 0]
  [6 6 5]
  [2 7 0]
  [5 4 3]]

 [[7 8 2]
  [9 1 2]
  [2 0 1]
  [8 0 9]]]

Для меня это выглядит как 4x3x2.

Я ошибаюсь, понимая 2x4x3 как изображение, приведенное выше? Почему Python печатает 3D-массивы, как это? И, наконец, если моя мысленная визуализация верна, как сгенерированные случайные значения расположены на изображении?

Ответы [ 2 ]

1 голос
/ 12 октября 2019

MATLAB / Octave отображает этот трехмерный массив как 3 блока (2,4) матриц

>> reshape(1:24,2, 4, 3)
ans =

ans(:,:,1) =

   1   3   5   7
   2   4   6   8

ans(:,:,2) =

    9   11   13   15
   10   12   14   16

ans(:,:,3) =

   17   19   21   23
   18   20   22   24

Но здесь конечный размер является самым внешним. Это называется основной столбец или соглашение Фортрана. Обратите внимание на то, как значения увеличиваются, спускаясь вниз по столбцу.

Но у NumPy ведущее измерение является наиболее внешним. Значения увеличиваются по строкам. Это мажор строки или C-порядок

In [22]: np.arange(1,25).reshape(2,4,3)                                         
Out[22]: 
array([[[ 1,  2,  3],
        [ 4,  5,  6],
        [ 7,  8,  9],
        [10, 11, 12]],

       [[13, 14, 15],
        [16, 17, 18],
        [19, 20, 21],
        [22, 23, 24]]])

Этот порядок измерений соответствует вложенности в эквивалентном списке:

In [24]: np.arange(1,25).reshape(2,4,3).tolist()                                
Out[24]: 
[[[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]],
 [[13, 14, 15], [16, 17, 18], [19, 20, 21], [22, 23, 24]]]

Значение измерений исходит от приложения и пользователя,не из Python / NumPy. Изображения часто (высота, ширина, каналы). В вычислительном отношении может быть удобно сохранить 3 (или 4) элемента канала для одного пикселя вместе, то есть сделать это измерение последним. Таким образом, ваше (2,4,3) можно представить как (2,4) изображение с 3 цветами (RGB). Обычный numpy отпечаток не лучший для визуализации этого.

Но если изображение имеет (400, 600, 3) форму, нам не нужна «печать» массива. Нам нужен график или изображение, изображение, которое отображает последнее измерение в виде цветов.

0 голосов
/ 12 октября 2019

Это 2 × 4 × 3. Первое измерение является самым внешним. Мы видим, что внешний список (см. Внешние квадратные скобки) имеет два элемента:

<b>[</b>[[6, 1, 0],
  [6, 6, 5],
  [2, 7, 0],
  [5, 4, 3]]<b>,</b>

 [[7, 8, 2],
  [9, 1, 2],
  [2, 0, 1],
  [8, 0, 9]]<b>]</b>

Каждый из этих элементов имеет одинаковые размеры: матрица 4 × 3. Действительно, если взглянуть на первый элемент списка, мы имеем:

<b>[</b>[6, 1, 0]<b>,</b>
 [6, 6, 5]<b>,</b>
 [2, 7, 0]<b>,</b>
 [5, 4, 3]<b>]</b>

здесь есть четыре строки, и если мы посмотрим на первую строку, например, мы увидим коллекцию стри элемента:

<b>[</b>6<b>,</b> 1<b>,</b> 0<b>]</b>
...