Как умножить каждый элемент массива на число python
Перейти к содержимому

Как умножить каждый элемент массива на число python

  • автор:

Базовые математические операции над массивами

Теперь, когда мы знаем как формировать массивы пришло время самого главного, самого важно для чего, собственно, и был разработан пакет NumPy – к рассмотрению его математических, вычислительных возможностей. И в основе своей эти вычисления базируются на матрицах и векторах. Но, обо всем по порядку и вначале поговорим о базовых математических операциях этого пакета.

Предположим, имеется обычный список и массив, созданный на его основе:

lst = [1, 2, 3] a = np.array([1, 2, 3])

Сейчас вы увидите принципиальную разницу между двумя этими объектами. Умножим их на число 2:

lst*2 # список: [1, 2, 3, 1, 2, 3] a*2 # массив: array([2, 4, 6])

Видите, при умножении списка языка Python, он дублируется дважды, а при умножении на NumPy массив – каждый его элемент умножается математически на число 2. Если бы мы захотели то же самое реализовать непосредственно на Python, оперируя списками, то пришлось бы делать что-то вроде:

[x*2 for x in lst]

Но выполнялась бы такая конструкция дольше, чем в случае с массивом NumPy. Именно благодаря удобству и скорости библиотека NumPy и приобрела свою популярность.

Итак, с массивами NumPy мы можем выполнять все базовые математические операции:

Пусть у нас задан тот же одномерный массив:

a = np.array([1, 2, 3])

Все указанные в таблице операции выполняются следующим образом:

-a # унарный минус a + 2 # сложение с числом 2 + a # так тоже можно записывать a - 3 # вычитание с числом a * 5 # умножение на число a / 5 # деление на число a // 2 # целочисленное деление a ** 3 # возведение в степень 3 a % 2 # вычисление по модулю 2

Разумеется, приоритеты этих операций такие же, что и при обычных математических вычислениях. А на выходе мы получаем новый массив с соответствующими значениями.

Давайте теперь добавим еще один массив:

b = np.array([3, 4, 5])

и посмотрим на эти же операции, но с участием двух массивов:

a - b # array([-2, -2, -2]) b + a # array([4, 6, 8]) a * b # array([ 3, 8, 15]) b / a # array([3. , 2. , 1.66666667]) b // a # array([3, 2, 1], dtype=int32) b ** a # array([ 3, 16, 125], dtype=int32) b % a # array([0, 0, 2], dtype=int32)

Везде мы видим поэлементные операции. Соответственно, чтобы они выполнялись, массивы должны быть согласованы по длине. Например, если взять массив:

b = np.array([3, 4, 5, 6])

и выполнить операцию:

a + b # ошибка: длины массивов не совпадают

то возникнет ошибка из-за несовпадения длин массивов. Но вот такая операция с двумерным массивом b сработает:

b = np.arange(1, 7) b.resize(2, 3) a + b

В этом случае массив a будет применен к каждой строке массива b и на выходе увидим результат:

Такое поведение получило название транслирование массивов. Подробнее о нем мы еще будем говорить.

Все рассмотренные операции можно распространить и на многомерные массивы, главное, чтобы они были согласованы по размерам. Я приведу два небольших примера, так как думаю, общий принцип здесь понятен. Пусть у нас трехмерный и двумерный массивы:

a = np.arange(1, 19) a.resize(3, 3, 2) b = np.ones((3, 2))

С ними можно выполнять такие очевидные операции:

a - b a * 10 a // b

И так далее. Причем, двумерный массив b может быть применен к трехмерному массиву a благодаря операции транслирования, так как их размеры согласованы. На самом деле, умножение трехмерного массива на число также реализуется через транслирование числа по всем элементам массива a.

Все представленные математические операции имеют следующие расширенные аналоги:

То есть, если нам нужно произвести какие-либо математические операции с массивом и изменения сохранить в нем же, то удобно использовать такие сокращенные записи. Выполняются они очевидным образом, например, так:

a = np.array([1, 2, 6, 8]) a += 5 b = np.ones(4) b *= a

И так далее. Но есть один нюанс работы этих операторов. Если, например, массив b определить с типом данных float64:

b = np.ones(4, dtype='float64')

а массив a имеет тип int32 (можно посмотреть через свойство a.dtype), то операция:

a += b

приведет к ошибке. С чем это связано? Дело в том, что результатом сложения вещественного числа с целочисленным, итоговое значение представляет собой вещественное число. Но тип данных массива a – целочисленный и он не может сохранять вещественные числа. Отсюда и возникает эта ошибка. Вообще, следует помнить правило:

При выполнении арифметических операций тип данных автоматически приводится к более общему.

То есть, при работе с целочисленными и вещественными числами на выходе получаем вещественные. При работе с вещественными и комплексными – комплексные. И так далее. Всегда результатом имеем более общий тип данных.

Все описанные математические операции можно комбинировать и записывать в виде:

(a + b)*5 - 10

Здесь круглые скобки, как и в математике, операция изменения приоритетов, то есть, сначала будет выполнено сложение, затем, умножение и в последнюю очередь вычитание.

Вот так работают и используются базовые математические операции в пакете NumPy при работе с массивами.

Видео по теме

#1. Пакет numpy — установка и первое знакомство | NumPy уроки

#2. Основные типы данных. Создание массивов функцией array() | NumPy уроки

#3. Функции автозаполнения, создания матриц и числовых диапазонов | NumPy уроки

#4. Свойства и представления массивов, создание их копий | NumPy уроки

#5. Изменение формы массивов, добавление и удаление осей | NumPy уроки

#6. Объединение и разделение массивов | NumPy уроки

#7. Индексация, срезы, итерирование массивов | NumPy уроки

#8. Базовые математические операции над массивами | NumPy уроки

#9. Булевы операции и функции, значения inf и nan | NumPy уроки

#10. Базовые математические функции | NumPy уроки

#11. Произведение матриц и векторов, элементы линейной алгебры | NumPy уроки

#12. Множества (unique) и операции над ними | NumPy уроки

#13. Транслирование массивов | NumPy уроки

© 2024 Частичное или полное копирование информации с данного сайта для распространения на других ресурсах, в том числе и бумажных, строго запрещено. Все тексты и изображения являются собственностью сайта

Как умножить каждый элемент массива на число python

На этом шаге мы рассмотрим назначение и примеры использования этих функций .

До сих пор мы только выводили элементы последовательностей. Теперь попробуем умножить каждый элемент списка на 2:

arr = [1, 2, 3] for i in arr: i = i * 2 print(arr)

Рис.1. Текст программы и результат выполнения

Архив с файлом можно взять здесь.

Как видно из примера, список не изменился. Переменная i на каждой итерации цикла содержит лишь копию значения текущего элемента списка. Изменить таким способом элементы списка нельзя. Чтобы получить доступ к каждому элементу, можно, например, воспользоваться функцией range () для генерации индексов. Функция range() имеет следующий формат:

range([Начало>, ]Конец>[, Шаг>])

Первый параметр задает начальное значение. Если параметр < Начало >не указан, то по умолчанию используется значение 0. Во втором параметре указывается конечное значение. Следует заметить, что это значение не входит в возвращаемые значения. Если параметр < Шаг >не указан, то используется значение 1. Функция возвращает диапазон — особый объект, поддерживающий итерационный протокол. С помощью диапазона внутри цикла for можно получить значение текущего элемента. В качестве примера умножим каждый элемент списка на 2 (рисунок 2).

arr = [1, 2, 3] for i in range(len(arr)): arr[i] *= 2 print(arr)

Рис.2. Текст программы и результат выполнения

Архив с файлом можно взять здесь.

В этом примере мы получаем количество элементов списка с помощью функции len () и передаем результат в функцию range () . В итоге функция range() возвращает диапазон значений от 0 до len (arr) — 1. На каждой итерации цикла через переменную i доступен текущий элемент из диапазона индексов. Чтобы получить доступ к элементу списка, указываем индекс внутри квадратных скобок. Умножаем каждый элемент списка на 2, а затем выводим результат с помощью функции print () .

Рассмотрим несколько примеров использования функции range() . Выведем числа от 1 до 100:

for i in range(1, 101): print(i)

Можно не только увеличивать значение, но и уменьшать его. Выведем все числа от 100 до 1:

for i in range(100, 0, -1): print(i)

Можно также изменять значение не только на единицу. Выведем все четные числа от 1 до 100:

for i in range(2, 101, 2): print(i)

В Python 3 поведение функция range() возвращает диапазон. Чтобы получить список чисел, следует передать диапазон, возвращенный функцией range() , в функцию list() (рисунок 3).

>>> obj = range(len([1, 2, 3])) >>> obj range(0, 3) >>> obj[0], obj[1], obj[2] # Доступ по индексу (0, 1, 2) >>> obj[0:2] # Получение среза range(0, 2) >>> i = iter(obj) >>> next(i), next(i), next(i) # Доступ с помощью итераторов (0, 1, 2) >>> list(obj) # Преобразование диапазона в список [0, 1, 2] >>> 1 in obj, 7 in obj # Проверка вхождения значения (True, False) 

Рис.3. Создание списка чисел на основе диапазона


    index (< Значение >) — возвращает индекс элемента, имеющего указанное значение. Если значение не входит в диапазон, возбуждается исключение ValueError . Пример:

>>> obj = range(1, 5) >>> obj.index(1), obj.index(4) (0, 3) >>> obj.index(5) Traceback (most recent call last): File "#11>", line 1, in obj.index(5) ValueError: 5 is not in range 
>>> obj = range(1, 5) >>> obj.count(1), obj.count(10) (1, 0) 

Функция enumerate (< объект >[, start=0]) на каждой итерации цикла for возвращает кортеж из индекса и значения текущего элемента. С помощью необязательного параметра start можно задать начальное значение индекса. В качестве примера умножим на 2 каждый элемент списка, который содержит четное число (рисунок 4).

arr = [1, 2, 3, 4, 5, 6] for i, elem in enumerate(arr): if elem % 2 == 0: arr[i] *= 2 print(arr)

Рис.4. Пример использования функции enumerate() . Текст программы и результат выполнения

Архив с файлом можно взять здесь.

Функция enumerate() не создает список, а возвращает итератор. С помощью функции next() можно обойти всю последовательность. Когда перебор будет закончен, возбуждается исключение StopIteration :

>>> arr = [1, 2] >>> obj = enumerate(arr, start=2) >>> next(obj) (2, 1) >>> next(obj) (3, 2) >>> next(obj) Traceback (most recent call last): File "", line 1, in next(obj) StopIteration 

Кстати, цикл for при работе активно использует итераторы, но делает это незаметно для нас.

На следующем шаге мы рассмотрим цикл while .

Как умножить каждый элемент js массива на 2

Можно воспользоваться методом arr.forEach он позволяет запускать функцию для каждого элемента массива.

18 октября 2022

Воспользуемся методом reduce() , который вызывает функцию-коллбэк на каждом элементе массива, а результат вызова накапливает в аккумуляторе.

const arr = [1, 2, 3, 4, 5]; const multiplyByTwo = (array) => array .reduce((acc, el) =>  acc.push(el * 2); return acc; >, []); console.log(multiplyByTwo(arr)); // => [2, 4, 6, 8, 10] 

20 октября 2021

Для этого можно воспользоваться методом map() , который перебирает и преобразовывает каждый элемент массива согласно колбек функции, которая в него передана. Например:

 x * 2); console.log(newCollection); // => [2, 4, 6]; 

Умножение списка на число

Студент Макс узнал, что в Python умножать можно не только числа, но и другие объекты, например, строку на число:

>>> "Max" * 3 'MaxMaxMax'

«Вау!» — подумал Макс — «А что если умножить список на число?»:

>>> [42, 26] * 3 [42, 26, 42, 26, 42, 26]

Значит можно создать двумерный массив очень кратко и элегантно?

arr = [[]] * 3 arr[0].append(10) arr[1].append(20) arr[2].append(30)

Макс ожидал получить:

[[10], [20], [30]]
[[10, 20, 30], [10, 20, 30], [10, 20, 30]]

�� Как же так?! Дело в том, что умножение списка на число не копирует сам объект, а лишь ссылку на него. Все три элемента arr ссылаются на один и тот же список. Легко проверить, сравнив адреса объектов:

>>> arr[0] is arr[1] True >>> id(arr[0]), id(arr[1]) (4400840776, 4400840776)

Диаграмма: все элементы arr указывают на один и тот же список.

Аналогично в случае классов:

class Dummy: . arr = [Dummy()] * 2 arr[0].x = 10 arr[1].x = 20 print(arr[0].x, arr[0] is arr[1]) # 20 True

А вот с числами, строками и кортежами умножение списка будет работать как ожидал Макс, потому что это неизменяемые типы. Вот такая тонкость, которую нужно знать. Максу следовало бы написать так:

arr = [[] for _ in range(3)] arr[0].append(10) arr[1].append(20) arr[2].append(30) >>> arr [[10], [20], [30]]

Менее кратко, но зато работает без сюрпризов: каждую итерацию создается новый пустой список.

�� Специально для канала @pyway. Подписывайтесь на мой канал в Телеграм @pyway ��

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *