Основы NumPy ndarray для новичков в глубоком обучении: array, dtype, shape, reshape, astype

1. Зачем начинать с ndarray?



При работе с глубоком обучением вы постоянно сталкиваетесь с такими кодами.

  • Проверка shape входного тензора
  • Использование reshape для батчей
  • Перевод в float32 для GPU‑вычислений…

Всё это основано на NumPy ndarray.

  • Tensor в PyTorch – почти прямой наследник структуры NumPy ndarray
  • Входы, веса и выходы моделей – это все многомерные массивы (тензоры)

Таким образом, понимание ndarray = освоение базовой синтаксики операций с тензорами.


2. Что такое ndarray?

ndarray – это сокращение от N‑dimensional array, то есть «многомерный массив».

  • 1‑мерный: вектор
  • 2‑мерный: матрица
  • 3‑мерный и выше: тензор (пакет изображений, временные ряды, видео и т.д.)

Простой пример:

import numpy as np

x = np.array([1, 2, 3])            # 1‑мерный (вектор)
M = np.array([[1, 2], [3, 4]])     # 2‑мерный (матрица)

print(type(x))          # <class 'numpy.ndarray'>
print(x.ndim, x.shape)  # количество измерений, форма
print(M.ndim, M.shape)
  • ndim: сколько измерений
  • shape: размерность каждого измерения

3. Насколько похож PyTorch Tensor?



Тензор PyTorch тоже – это «многомерный массив».

import torch

x_np = np.array([[1, 2], [3, 4]])   # NumPy ndarray
x_torch = torch.tensor([[1, 2], [3, 4]])  # PyTorch Tensor

print(type(x_np))      # numpy.ndarray
print(type(x_torch))   # torch.Tensor

print(x_np.shape)      # (2, 2)
print(x_torch.shape)   # torch.Size([2, 2])

Общие черты:

  • Оба – «многомерные числовые массивы»
  • Концепции shape, reshape, dtype почти одинаковы
  • Операции (+, *, @ и т.д.) схожи

Различия (важные для глубоком обучении):

  • NumPy: только CPU, без автодифференцирования
  • PyTorch Tensor: поддержка GPU, автодифференцирование

Обычно так делят работу:

  • Концептуальная практика / эксперименты с формулами / манипуляции данными → NumPy
  • Фактическое обучение модели → PyTorch

Чем лучше вы знакомы с ndarray, тем более естественно будет работать с тензорами PyTorch.


4. np.array: базовый способ создания ndarray

Самый базовый конструктор ndarray – это np.array.

4.1 Перевод списка Python → ndarray

import numpy as np

# 1‑мерный массив (вектор)
x = np.array([1, 2, 3])
print(x)
print(x.ndim)   # 1
print(x.shape)  # (3,)

# 2‑мерный массив (матрица)
M = np.array([[1, 2, 3],
              [4, 5, 6]])
print(M)
print(M.ndim)   # 2
print(M.shape)  # (2, 3)
  • Список/список списков → np.arrayndarray
  • Таблицы вида batch_size x feature_dim – тоже такой же формат

4.2 Быстрое создание массивов с начальными значениями

В учебных примерах часто нужны массивы, заполненные нулями, единицами или случайными числами.

zeros = np.zeros((2, 3))       # 2x3 матрица, все нули
ones = np.ones((2, 3))         # 2x3 матрица, все единицы
randn = np.random.randn(2, 3)  # случайные числа из нормального распределения

print(zeros.shape)  # (2, 3)

Такая же схема почти идентична в PyTorch.

import torch

zeros_t = torch.zeros((2, 3))
ones_t = torch.ones((2, 3))
randn_t = torch.randn((2, 3))

5. dtype: понимание типа данных

dtype – это тип данных внутри массива (int, float, и т.д.).

Часто встречаются:

  • int32, int64: целые
  • float32, float64: плавающие

Проверим:

x = np.array([1, 2, 3])
print(x.dtype)  # обычно int64 или int32

y = np.array([1.0, 2.0, 3.0])
print(y.dtype)  # обычно float64

5.1 Создание с указанием dtype

x = np.array([1, 2, 3], dtype=np.float32)
print(x.dtype)  # float32

В глубоком обучении обычно используют float32 (PyTorch torch.float32), так как это оптимально для GPU и экономит память.


6. shape: чтение формы данных

shape – это кортеж, показывающий размерность каждого измерения.

import numpy as np

x = np.array([1, 2, 3])
print(x.shape)  # (3,)

M = np.array([[1, 2, 3],
              [4, 5, 6]])
print(M.shape)  # (2, 3)

Типичные примеры в глубоком обучении:

  • Вектор признаков: (feature_dim,) → например, (3,)
  • Батч данных: (batch_size, feature_dim) → например, (32, 3)
  • Пакет изображений (PyTorch): (batch_size, channels, height, width) → например, (32, 3, 224, 224)

Если вы привыкнете к работе с shape в NumPy, то при ошибках в PyTorch быстрее поймёте, где проблема.


7. reshape: изменение формы

reshape меняет форму массива, но сохраняет общее количество элементов.

import numpy as np

x = np.array([1, 2, 3, 4, 5, 6])
print(x.shape)  # (6,)

M = x.reshape(2, 3)
print(M)
print(M.shape)  # (2, 3)

Важно:

  • После reshape общее число элементов должно оставаться тем же.

7.1 Автоматический расчёт с -1

В батчах и обработке изображений часто используют -1. -1 означает «вычислить автоматически».

x = np.array([[1, 2, 3],
              [4, 5, 6]])  # shape: (2, 3)

# Полностью развернуть в 1‑мерный массив
flat = x.reshape(-1)        # shape: (6,)
print(flat)

# Снова в 2 строки, столбцы вычисляются автоматически
M = flat.reshape(2, -1)     # shape: (2, 3)
print(M)

В PyTorch аналогично:

import torch

x_t = torch.tensor([[1, 2, 3],
                    [4, 5, 6]])  # (2, 3)

flat_t = x_t.reshape(-1)        # (6,)
M_t = flat_t.reshape(2, -1)     # (2, 3)

Понимание reshape упрощает:

  • flatten feature map в CNN
  • Формирование входов (batch, seq_len, feature) для RNN/LSTM
  • Перестановку батч‑измерения

8. astype: изменение типа данных

astype меняет тип данных массива.

import numpy as np

x = np.array([1, 2, 3])      # int
print(x.dtype)               # int32 или int64

x_float = x.astype(np.float32)
print(x_float)
print(x_float.dtype)         # float32

Типичные случаи в глубоком обучении:

  • Перевод целочисленных меток в float для расчёта потерь
  • Приведение float64 к float32 для совместимости
  • Подгонка типов перед передачей в PyTorch

Пример:

import torch
import numpy as np

x = np.array([1, 2, 3], dtype=np.int32)
x = x.astype(np.float32)              # преобразуем в float32
x_torch = torch.from_numpy(x)         # преобразуем в тензор
print(x_torch.dtype)                  # torch.float32

Если типы не совпадают, в PyTorch может возникнуть ошибка вида «Expected Float but got Double».


9. Итоги: основные конструкции ndarray

В этой статье рассмотрены:

  1. Что такое ndarray? – фундаментальная структура многомерных массивов
  2. Связь с PyTorch Tensor – почти идентичные концепции
  3. np.array – создание из списков
  4. dtype – типы чисел (int, float, 32/64‑бит)
  5. shape – форма данных, ключевой атрибут
  6. reshape – изменение формы без потери элементов (использование -1)
  7. astype – преобразование типов

Умение быстро работать с этими четырьмя конструкциями позволяет:

  • Не паниковать при ошибках формы тензора
  • Легко переходить от математических формул к коду
  • Быстро следовать примерам PyTorch‑туториалов

image