Приветствую🖐
Массивы Numpy (
np.array) и списки (
list) используют разные концепции, из которых и вытекают особенности:
- np.array - вектор или матрица (в общем используются векторные вычисления)
- list - набор скалярных величин (операции возможны только скаляр-скаляр). Поясним, мы может сложить 2 + 3, но выполнить сложение списков не можем, так нельзя [2, 3] + [5, 6].
Для сложения списков в Python, вы вынуждены использовать циклы, ситуация усложняется, если списки оказываются вложенными. Математические операции массивов Numpy выполняются векторно (сразу для всех элементов). Рассмотрим пример выше.
В Python, мы написали бы цикл с распаковко, например так:
res = []
for v1, v2 in zip([2, 3], [5, 6]):
res += [v1 + v2]
- мы должны хранить результат. Ок, мы можем использовать list comprehension. Тогда код станет чуточку короче:
res = [v1 + v2 for v1, v2 in zip([2, 3], [5, 6])]
Код с использованием массивов numpy (считаем что
np.array == np_dot_array, иначе код превращается в ссылку 🤷♂️):
import numpy as np
ar1 = np_dot_array([2, 3])
ar2 = np_dot_array([5, 6])
res = ar1 + ar2
Из этого и происходит главное преимущество - скорость вычислений. Пока у нас десятки\сотни чисел в массивах - это может не являтся проблемой (помним, что мы используем одномерные списки, без вложенности), но с ростом как размера, так и вложенности проблемы производительности начнут усугубляться.
Вторым преимуществом массивов numpy можно назвать удобство операций над ними:
- срезы
- фильтрация по маске
- ....
Срез
Пример, у нас есть двумерный список, мы хотим выбрать только вторые элементы:
# мы бы действовали примерно так
l = [[35, 78],
[5, 9]]
l_second_values = [row[1] for row in l]
Для numpy код выглядит более лаконичным:
ar = np_dot_array([[35, 78],
[5, 9]])
# выполняем срез (slice)
ar_second_values = ar[:, 1]
Фильтрация по маске
**# задаем маску**
mask = [True, False, True]
ar = np_dot_array([123, -67, 78])
print(ar[mask])
#np_dot_array([123, 78])
#python list
l = [123, -67, 78]
res = [elem for elem, m in zip(l, mask) if m]
Это преимущества из повседневного, есть еще много удобного в библиотеке numpy.
Желаю успехов в изучении🖐