Ключевые отличия numpy.ndarray от обычного list в Python лежат в устройстве памяти, типизации и модели вычислений.
list — это контейнер ссылок. Каждый элемент списка — отдельный объект Python, лежащий где угодно в памяти. Сам список хранит массив указателей на эти объекты. Из-за этого:
– элементы могут быть разных типов
– доступ и операции дороже по памяти и по CPU
– любая арифметика требует явных циклов Python
ndarray — это плотный блок памяти с данными одного типа. Объект массива хранит метаданные (форма, тип, шаги) и указатель на непрерывный буфер. Следствия:
– все элементы одного dtype
– минимальные накладные расходы
– операции выполняются в скомпилированном коде NumPy
Типизация:
– list: гетерогенный ([1, "a", 3.5] — нормально)
– ndarray: гомогенный (dtype один на весь массив)
Многомерность:
– list: вложенные списки, форма неявная и не проверяется
– ndarray: нативная n-мерность, форма фиксирована (shape)
Производительность:
– list: операции поэлементно в Python (for)
– ndarray: векторизация, SIMD, BLAS, кеш-френдли доступ
Поведение операций:
– list:
[1, 2, 3] + [4, 5] # конкатенация– ndarray:
np.array([1, 2, 3]) + np.array([4, 5, 6]) # поэлементное сложениеСрезы:
– list: срез создаёт копию
– ndarray: срез обычно возвращает view без копирования (через strides)
Использование памяти:
– list: большие накладные расходы на каждый элемент
– ndarray: плотное хранение, близкое к C-массиву
Практический вывод, как в реальной жизни:
– list — для произвольных коллекций, логики, небольших данных
– ndarray — для численных расчётов, математики, статистики, ML, сигналов
Если кратко:
list — универсальная структура данных Python.
ndarray — специализированная вычислительная структура с жёсткой моделью памяти и типов.