Скидка на подшипники из наличия!
Новое поступление товара в 2026 году!
NumPy для инженера — это переход от медленных циклов по спискам к быстрым векторным вычислениям над массивами. Библиотека NumPy даёт однородный многомерный массив ndarray и набор операций над ним: поэлементную арифметику, работу с матрицами, линейную алгебру и решение систем линейных уравнений. Для инженерных расчётов это означает компактный код, который читается как формула и выполняется со скоростью скомпилированного кода на C.
Ниже — краткий, но практический разбор: чем массив отличается от списка, как заменить циклы векторными операциями, как работать с матрицами и решать СЛАУ, с примерами кода под типовые инженерные задачи.
Список Python универсален, но для чисел неэффективен: элементы разнотипны, хранятся вразброс, а любая операция идёт интерпретируемым циклом. Массив NumPy — однородный (все элементы одного типа), хранится компактным непрерывным блоком, а операции выполняются оптимизированным кодом на C сразу над всем массивом. Такой приём называется векторизацией: вместо явного цикла записывается одно выражение над массивом.
Главный принцип: там, где на чистом Python был бы цикл по числам, в NumPy пишется одно векторное выражение.
Массив создают из готовых данных функцией np.array либо генерируют конструкторами. У массива есть форма shape, тип элементов dtype и число измерений ndim; форму можно менять методом reshape без копирования данных.
np.array
shape
dtype
ndim
reshape
import numpy as np d = np.array([10, 12, 16, 20]) # диаметры, мм print(d.shape) # (4,) print(d.dtype) # int64 (зависит от платформы) grid = np.linspace(0, 1, 5) # [0. 0.25 0.5 0.75 1. ] M = np.zeros((3, 3)) # нулевая матрица 3x3
Массив однороден: у него единый тип элементов. Смешение целых и вещественных приведёт тип к вещественному, а попытка положить в целочисленный массив дробное значение усечёт его. Тип задают явно параметром dtype, например np.array([1, 2, 3], dtype=float).
np.array([1, 2, 3], dtype=float)
Арифметика над массивами поэлементна: +, -, *, /, ** применяются к каждому элементу, а функции np.sin, np.exp, np.sqrt и другие работают над всем массивом сразу. Это прямая замена цикла.
+
-
*
/
**
np.sin
np.exp
np.sqrt
import numpy as np d = np.array([10, 12, 16, 20]) # диаметры, мм A = np.pi * d**2 / 4 # площади сечения, мм^2 # A = [ 78.54 113.10 201.06 314.16 ] F = np.array([1000, 2000, 3000, 4000]) # силы, Н sigma = F / A # напряжения, Н/мм^2 = МПа
Broadcasting — правило, по которому NumPy автоматически «растягивает» массивы разной формы до совместимой, если их размерности согласуются. Простейший случай — операция массива со скаляром: скаляр применяется к каждому элементу. Так же можно, например, прибавить вектор-строку к каждой строке матрицы.
T_c = np.array([20, 35, 50]) # температуры, °C T_k = T_c + 273.15 # перевод в кельвины (broadcasting со скаляром) M = np.ones((3, 3)) row = np.array([1, 2, 3]) R = M * row # row умножается на каждую строку M
Векторизация не только короче, но и быстрее: цикл по элементам на Python заменяется одной операцией в скомпилированном ядре.
К элементам обращаются по индексам с нуля; для двумерных массивов индексация двойная — M[i, j]. Срезы a[start:stop:step] возвращают подмассивы. Особенно полезна инженеру булева маска — отбор элементов по условию, то есть фильтрация данных без цикла.
M[i, j]
a[start:stop:step]
sigma = np.array([12.7, 17.7, 14.9, 25.3]) # напряжения, МПа over = sigma[sigma > 20] # элементы больше 20: [25.3] count = np.sum(sigma > 20) # сколько превышений: 1 sigma[sigma > 20] = 20.0 # обрезать всё, что выше порога col = M[:, 0] # весь нулевой столбец матрицы M
Условие sigma > 20 возвращает булев массив той же формы; его можно использовать как индекс для выборки или присваивания, а сумма булева массива даёт число истинных элементов.
sigma > 20
Матрица в NumPy — это обычный двумерный массив. Матричное умножение выполняется оператором @ (не путать с * — поэлементным). Транспонирование — атрибут .T. Основные операции линейной алгебры собраны в подмодуле numpy.linalg.
@
.T
numpy.linalg
A = np.array([[1, 2], [3, 4]]) B = np.array([[5, 6], [7, 8]]) C = A @ B # [[19 22] [43 50]] At = A.T # [[1 3] [2 4]] detA = np.linalg.det(A) # ≈ -2.0 (число с плавающей точкой)
Функции линейной алгебры возвращают числа с плавающей точкой, поэтому результат может содержать крошечную погрешность округления (например, определитель, равный −2, иногда выводится как −2.0000000000000004). При сравнении величин используйте допуск, а не проверку на точное равенство.
Для матриц используйте двумерный ndarray, а не устаревший тип np.matrix — он не рекомендуется даже для линейной алгебры. Оператор @ — предпочтительный способ матричного умножения двумерных массивов.
ndarray
np.matrix
Система линейных уравнений записывается в матричной форме A·x = b, где A — матрица коэффициентов, b — вектор правых частей. Решение находит функция np.linalg.solve(A, b). Она вычисляет решение через разложение (LAPACK) и точнее и быстрее, чем явное умножение на обратную матрицу.
A·x = b
A
b
np.linalg.solve(A, b)
2x + y − z = 8
−3x − y + 2z = −11
−2x + y + 2z = −3
solve
[x, y, z]
import numpy as np A = np.array([[ 2, 1, -1], [-3, -1, 2], [-2, 1, 2]]) b = np.array([8, -11, -3]) x = np.linalg.solve(A, b) # [ 2. 3. -1.]
Матрица A должна быть квадратной и невырожденной (полного ранга). Если она вырождена или не квадратна, NumPy возбудит исключение LinAlgError. Для переопределённых систем (уравнений больше, чем неизвестных) применяют метод наименьших квадратов np.linalg.lstsq.
LinAlgError
np.linalg.lstsq
Такой подход удобен для инженерных задач, сводящихся к линейным балансам: узловые уравнения, схемы, статически определимые системы, материальные и энергетические балансы.
inv(A) @ b
np.linalg.solve
Он заменяет циклы по числам векторными операциями над массивами: код становится короче и читается как формула, а вычисления идут со скоростью скомпилированного ядра на C. Плюс встроенная линейная алгебра и решение систем уравнений.
Массив однороден (все элементы одного типа) и хранится компактным непрерывным блоком, поэтому операции над ним выполняются оптимизированным кодом сразу над всеми элементами. Список разнотипен и обрабатывается медленным интерпретируемым циклом.
Записать её в виде A·x = b и вызвать np.linalg.solve(A, b). Матрица A должна быть квадратной и невырожденной; для несовместных или переопределённых систем используют np.linalg.lstsq.
Звёздочка выполняет поэлементное умножение массивов одинаковой формы, а оператор @ — матричное умножение по правилам линейной алгебры. Для произведения матриц нужен именно @.
Это правило автоматического согласования форм: массивы разного размера «растягиваются» до совместимой формы, если их размерности сочетаются. Простейший пример — операция массива со скаляром, который применяется к каждому элементу.
Булевой маской: выражение вида a[a > порог] возвращает элементы, удовлетворяющие условию. Ту же маску можно использовать для присваивания, а сумма булева массива даёт число подходящих элементов.
Нет. Матрица — это обычный двумерный массив. Устаревший тип np.matrix использовать не рекомендуется; для линейной алгебры применяют двумерный ndarray и оператор @.
Вы можете задать любой вопрос на тему нашей продукции или работы нашего сайта.