Размерности массивов

Обычно для трансформации даже самых скудных данных требуется далеко не одно число. На практике я помещаю даже одно единственное число в особую квадратную папку, а символически записываю это посредством квадратных скобок "[ ]".

Теперь особый момент. Если число - это просто число, то для меня - это скаляр. Ну а в квадратных скобках оно становится массивом.

Пример:

* 4 - скаляр
* [4] - массив

Далее, в одну свою квадратную папку я могу вместить много чисел, она почти бездонная. Но - только по одному числу в глубину за раз! Каждое число как бы прячется за предыдущим, удаляясь по одному вглубь папки. Если мы бы рисовали в тетради, то все эти числа из такой вот папки уместили бы на одной прямой. Помните, как в математике или физике: есть у нас вектор с началом и концом, который идёт из одной точки просто в определенную сторону. Вот на такой прямой мы бы их и уместили. Поэтому я даже стал такие папки называть **векторами**:

* [1 2] - вектор

Только вот жаль, но даже "Квадрат Малевича" с помощью таких папок в цифровой формат не переведёшь. Очень много их понадобится. Поэтому я научился использовать папки большего размера, в математике уже известные как **матрицы**:

* [1 2 3 4] - это всё одна матрица

В матрице можно числа не только одно за другим расположить, но и в высоту(по столбикам), и в ширину(по строкам).

Это долгое время была весьма удобно, но информации становилось всё больше, и мне пришлось научиться ... помещать большие папки в ещё более большие папки. Чтобы взять вот так десять матриц, и разом их в одну папку поместить, а когда таких больше станет, то и их все в одну - место при этом экономится, а объём информации возрастает! Такие матрицы матриц я назвал **тензорами**:

* [[1 2] [2 4] [3 4] [7 6]] - это уже тензор

Так как работать приходиться с большими массивами чисел, то, соответсвенно, тензоры я и использую больше всего.

А создать тензор со случайными числами можно всё теми же методами, что я и приводил ранее:

```
tensor = np.random.randint(-5, 5, (3, 2, 2))          # Во вторых скобках наметим размеры тензора в высоту, ширину, глубину(оси X,Y,Z)
tensor                                                # Создаём трехмерный тензор,и выглядит он таким образом:

array([[[-5, -2],
        [ 3,  1]],

       [[ 3, -5],
        [-3,  2]],

       [[ 4, -4],
        [ 4,  3]]])

```
Не стоит пугаться большого количества квадратных скобок в начале тензора и в конце.Просто представьте, как бы вы рисовали объёмный куб на листе бумаги? Вот и посмотрите теперь на эти скобочки не как будто они в ряд, а будто немного удаляются для объёма - это и есть глубина тензора, можно это представить в виде слоёв. В коробку не поместить вещи, если она плоская. Так и здесь - это способ вместить побольше матриц.

Спешу сообщить методы для определения свойств таких больших массивов:

* **`.ndim`** сообщит, сколько измерений в тензоре(может ведь быть и больше 3-х!)
* **`.shape`** сообщит нам, насколько каждое из измерений велико в высоту/ширину/глубину(т.е. по столбикам, строкам и слоям)
* **`.size`** скажет, сколько в таком тензоре всего занятых мест

Посмотрим на работу методов в действии:

```
print('Количество осей: ',tensor.ndim)
print('Размерность: ',tensor.shape)
print('Количество значений: ',tensor.size)

Количество осей:  3
Размерность:  (3, 2, 2)
Количество значений:  12

```
Давайте кратко обобщим сведения о размерах массивов примерами:

```
np.random.randint(-5, 5, 4)               # Так выводится одномерный массив (вектор)

array([-3,  1, -3,  3])

```

```
np.random.randint(-5, 5, (5, 2))          # Так выводится двумерный массив (матрица)

array([[-4, -1],
       [ 0,  4],
       [ 0,  4],
       [-2,  2],
       [-1,  2]])

```

```
np.random.randint(-5, 5, (2,2,2,2,2))     # Так выводится пятимерный массив (тензор)

array([[[[[-2,  0],
          [-2,  3]],
         [[ 2, -3],
          [ 4,  4]]],
        [[[ 1,  1],
          [ 0,  0]],
         [[ 3,  3],
          [-4, -3]]]],
       [[[[-4, -3],
          [ 0,  3]],
         [[ 4, -3],
          [-3, -5]]],
        [[[-5,  0],
          [ 0,  3]],
         [[ 2, -4],
          [-3,  2]]]]])

```