
Операции сложения массивов в Python зависят от используемых инструментов: встроенные списки, библиотека NumPy или специализированные структуры данных. Каждый вариант отличается скоростью, синтаксисом и возможностями обработки числовых данных.
При работе со списками сложение приводит к конкатенации, а не к арифметической сумме. Например, [1, 2] + [3, 4] вернёт [1, 2, 3, 4]. Для поэлементного сложения придётся использовать цикл или функции map() и zip().
Если требуется обработка больших массивов чисел, целесообразно использовать NumPy. В этом случае выражение np.array([1, 2]) + np.array([3, 4]) вернёт [4 6] без дополнительного кода. Такой подход быстрее и поддерживает векторизацию, что критично для анализа данных и машинного обучения.
Альтернативой могут быть списковые включения, позволяющие совмещать читаемость и гибкость. Например, [a + b for a, b in zip([1, 2], [3, 4])] даёт тот же результат, что и NumPy, но без сторонних библиотек.
Сложение массивов списков через цикл for

При работе с обычными списками Python удобно складывать элементы по индексам с помощью цикла for. Такой метод подходит, когда размеры массивов совпадают.
Пример:
a = [1, 2, 3, 4]
b = [10, 20, 30, 40]
result = []
for i in range(len(a)):
result.append(a[i] + b[i])
print(result) # [11, 22, 33, 44]
Если длины массивов отличаются, важно заранее определить стратегию: обрезать лишние элементы или дополнить отсутствующие нулями. Например:
a = [1, 2, 3]
b = [10, 20]
result = []
min_len = min(len(a), len(b))
for i in range(min_len):
result.append(a[i] + b[i])
print(result) # [11, 22]
Использование цикла for обеспечивает полный контроль над индексами и позволяет гибко обрабатывать данные: проверять условия, фильтровать элементы или добавлять новые правила сложения.
Использование функции zip для покомпонентного сложения

Функция zip объединяет элементы нескольких итерируемых объектов в кортежи по индексам. Это удобно для покомпонентного сложения массивов одинаковой длины.
Пример:
a = [1, 2, 3]
b = [4, 5, 6]
result = [x + y for x, y in zip(a, b)]
print(result) # [5, 7, 9]
Если массивы разной длины, результат ограничивается минимальной длиной. Для контроля можно использовать itertools.zip_longest с указанием значения по умолчанию:
from itertools import zip_longest
a = [1, 2]
b = [10, 20, 30]
result = [x + y for x, y in zip_longest(a, b, fillvalue=0)]
print(result) # [11, 22, 30]
Метод на основе zip работает быстрее, чем явные циклы с индексами, так как не требует обращения к элементам по индексу. Рекомендуется использовать его, когда важна читаемость кода и массивы имеют одинаковый размер.
Применение list comprehension для объединения результатов

При работе с данными разной длины удобно комбинировать элементы по индексам: [a + b for a, b in zip(list1, list2)]. Такой подход формирует новый массив, исключая необходимость явного for и ручного добавления элементов.
Для фильтрации в процессе объединения можно сразу задать условие: [x for arr in arrays for x in arr if x % 2 == 0]. Это позволяет одновременно объединять и отбирать данные по заданным критериям.
Если необходимо создать матрицу на основе комбинаций элементов, применяется вложенный comprehension: [(i, j) for i in list1 for j in list2]. Это обеспечивает быстрый перебор пар без использования itertools.product.
Такой способ подходит для работы с большими массивами, поскольку уменьшает количество кода и упрощает читаемость при сохранении эффективности.
Сложение массивов с помощью модуля array

Модуль array позволяет работать с однородными последовательностями чисел. В отличие от списков, элементы массива имеют фиксированный тип, что ускоряет операции и экономит память. Для сложения массивов можно использовать поэлементное вычисление с циклом или генератором.
Пример сложения двух массивов одинаковой длины:
from array import array
a = array('i', [1, 2, 3, 4])
b = array('i', [10, 20, 30, 40])
c = array('i', (x + y for x, y in zip(a, b)))
print(c) # array('i', [11, 22, 33, 44])
Если массивы имеют разную длину, используется zip, который обрезает результат по минимальному размеру. Чтобы сохранить все элементы, можно применить itertools.zip_longest с указанием значения по умолчанию:
from itertools import zip_longest
from array import array
a = array('i', [1, 2, 3])
b = array('i', [10, 20, 30, 40, 50])
c = array('i', (x + y for x, y in zip_longest(a, b, fillvalue=0)))
print(c) # array('i', [11, 22, 33, 40, 50])
Сравнение подходов:
| Метод | Описание | Когда использовать |
|---|---|---|
zip |
Складывает элементы до минимальной длины массива | Когда важна строгая синхронизация размеров |
zip_longest |
Дополняет короткий массив значениями fillvalue |
Когда требуется сохранить все элементы длинного массива |
Работа с numpy.add для покомпонентного сложения

numpy.add выполняет поэлементное сложение массивов одинаковой формы и поддерживает трансляцию размеров. В отличие от оператора +, функция предоставляет больше контроля за счёт параметров.
Пример базового использования:
import numpy as np
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
result = np.add(a, b)
print(result) # [5 7 9]
Функция принимает аргумент out, позволяющий сохранить результат в заранее подготовленный массив и избежать лишнего выделения памяти:
c = np.empty(3, dtype=int)
np.add(a, b, out=c)
print(c) # [5 7 9]
При работе с многомерными структурами numpy.add корректно применяет правила broadcasting:
x = np.array([[1], [2], [3]])
y = np.array([10, 20, 30])
print(np.add(x, y))
# [[11 21 31]
# [12 22 32]
# [13 23 33]]
Использование where позволяет выполнять условное сложение:
mask = np.array([True, False, True])
print(np.add(a, b, where=mask)) # [5 2 9]
Рекомендуется применять numpy.add, когда требуется контроль над выходным массивом, условная обработка или оптимизация работы с большими данными.
Использование numpy.sum для сложения нескольких массивов

Функция numpy.sum позволяет эффективно суммировать несколько массивов одновременно, обеспечивая высокую производительность за счет оптимизированных вычислений на уровне C. Основное преимущество заключается в возможности работы с многомерными массивами и выборке осей для суммирования.
Пример суммирования нескольких одномерных массивов:
import numpy as np
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
c = np.array([7, 8, 9])
result = np.sum([a, b, c], axis=0)
print(result) # [12 15 18]
Здесь ключевой момент – использование параметра axis=0, который указывает на суммирование элементов по соответствующим индексам массивов.
Суммирование многомерных массивов:
d = np.array([[1, 2], [3, 4]])
e = np.array([[5, 6], [7, 8]])
result2 = np.sum([d, e], axis=0)
print(result2) # [[ 6 8]
# [10 12]]
Рекомендации по использованию numpy.sum:
- Перед суммированием убедитесь, что массивы имеют одинаковую форму (
shape), иначе возникнет ошибка. - Для суммирования по конкретной оси используйте параметр
axis, иначе произойдет суммирование всех элементов массива. - При работе с большим количеством массивов
numpy.sumэффективнее, чем последовательное сложение через оператор+, так как выполняется векторизованно. - Для суммирования списков Python сначала преобразуйте их в массивы
np.array, чтобы использовать преимущества производительности.
Пример суммирования списка массивов с разными размерами запрещен, но можно привести универсальное решение с np.pad для выравнивания размеров перед суммированием.
Вопрос-ответ:
Какие способы объединения списков в Python существуют без использования сторонних библиотек?
В Python можно объединять списки с помощью оператора «+», который создаёт новый список, содержащий элементы обоих списков. Также можно использовать метод extend(), который добавляет элементы одного списка к другому на месте, без создания нового объекта. Кроме того, для последовательного перебора и добавления элементов часто используют цикл for, добавляя каждый элемент в нужный список с помощью append(). Каждый способ имеет свои особенности: оператор «+» удобен для кратких операций, extend() экономит память, а цикл позволяет применить дополнительные условия при добавлении элементов.
Можно ли сложить массивы чисел разного типа, например целые и дробные, и что при этом произойдёт?
Да, в стандартных списках Python можно объединять элементы разных типов. Если в списках есть целые и дробные числа, они просто будут находиться вместе в новом списке без преобразования типов. Операции сложения, как через «+», так и через extend(), не изменяют тип элементов. В случае работы с массивами NumPy тип элементов может автоматически привести к более общему типу: при смешении int и float все значения будут приведены к float, чтобы сохранить точность дробных чисел.
Как объединять массивы с использованием NumPy и в чём отличие от стандартных списков?
В NumPy массивы объединяются с помощью функций concatenate(), stack() или hstack()/vstack(). concatenate() объединяет массивы вдоль заданной оси, stack() создаёт новый массив с дополнительной осью, а hstack() и vstack() удобны для горизонтального и вертикального объединения соответственно. В отличие от списков Python, массивы NumPy требуют одинакового типа элементов и позволяют работать с многомерными структурами, что делает возможным объединение матриц и тензоров без вложенных циклов.
Можно ли объединять списки и массивы NumPy между собой, и есть ли ограничения?
Прямое сложение списка Python и массива NumPy через «+» не сработает — возникнет ошибка. Сначала нужно привести один из объектов к типу другого. Например, список можно преобразовать в массив NumPy с помощью array(), после чего объединять через функции NumPy. Аналогично, массив можно преобразовать в список с помощью tolist(), чтобы использовать стандартные операции списков. Ограничением является то, что при работе с NumPy важно соблюдать совместимость размерностей и тип элементов для корректного объединения.
