Теперь Кью работает в режиме чтения

Мы сохранили весь контент, но добавить что-то новое уже нельзя

Каковы преимущества массивов NumPy перед списками Python (в частности, вложенными списками)?

Программирование
Ivan Bushmakov
  · 3,0 K
Data engineer, пишу на python, люблю sqlalchemy, иногда копаюсь в data science  · 30 сент 2021
Приветствую🖐
Массивы 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.
Желаю успехов в изучении🖐
кхм >  Поясним, мы может сложить 2 + 3, но выполнить сложение списков не можем, так нельзя [2, 3] + [5, 6]. Python... Читать дальше
@Артемий Шувалов, спасибо, что обратили внимание.
Это интересный факт:
  • под _выполнить сложение списков не можем_ имеется ввиду в математическом смысле, то есть так как реализовано в numpy -  поэлементное сложение:
[1, 2] + [3, 4] = [4, 6]
Я бесконечно осмысленный объект вселенной. Я не наследую ничего, состою из бесконечного...  · 30 сент 2021
Более эффективное запоминание под ячейки и их реформирование в последствии. Давайте надбавим ещё пару десятков символов, что бы данный текст мог быть выложен.
Простите, но, как я думаю, вы не правы, заявляя во вю"всечитание" о моем русском, и убеждая других в моем не... Читать дальше
Электрик Знаю, как подключить плк к компьютеру Прдставляю, чем отличается спектр звука...  · 11 дек 2021
Простите, но, с точки зрения ассемблера, а ведь компилятор это будет строить - ни какой. Всё зависит от компилятра. А остальное - лишь внешний вид и "удобночитаемость". А, в этом случае, я уже упоминал, "почти разговорный аглицкий" (а как печать, если не я PRINT, и не важно куда, указать можно, без всяких "fprint"... И прочей ерунды) дедушку "Фортран" и поныне... Читать далее
1 эксперт не согласен
Полное непонимание поставленного вопроса и незнание матчасти. Плюс ужасные детские ошибки, плохой русский и оформление.