Короткий ответ
NumPy-массив (ndarray) хранит однородные данные одного типа в непрерывном блоке памяти, что позволяет выполнять векторизованные операции быстрее и компактнее, чем над обычным списком Python.
Как это работает подробнее
список Python хранит ссылки на произвольные объекты, и операции над ним выполняются через интерпретируемый цикл; ndarray хранит значения одного dtype подряд в памяти, а операции (сложение, умножение) реализованы в скомпилированном C-коде и применяются сразу ко всему массиву.
Пример кода
Пример Python
import numpy as np
a = [1, 2, 3]
b = np.array([1, 2, 3])
print(a + a) # [1, 2, 3, 1, 2, 3]
print(b + b) # [2 4 6]Что использовать на практике
- На практике: для числовых расчётов на больших объёмах данных операции с массивами NumPy в разы быстрее, чем цикл for по списку; при этом смешивание типов в массиве (например, числа и строки) приводит к dtype=object и потере преимущества в скорости.
- Проверка: два вывода наглядно различаются — конкатенация списка против поэлементного сложения массива, что и объясняет разницу поведения.
Подводные камни
- Частые ошибки: складывают списки оператором + и получают конкатенацию вместо поэлементного сложения, в отличие от массивов NumPy, где + складывает поэлементно; не приводят входные данные к числовому dtype и удивляются, почему векторизация не ускоряет код.