Доброго времени суток, читатели, зрители моего канала programmer's notes. Не забывайте подписываться и писать свои комментарии к моим статьям и видео.
Продолжение статей по numpy
Продолжаем изучать возможности библиотеки numpy
Продолжаем изучать замечательную библиотеку numpy.
Бинарные числовые функции библиотеки numpy
Ниже мы даём справочник бинарных числовых функций библиотеки numpy. Справочник унарным функций см. здесь
- add — поэлементное сложение массивов;
- subtract — поэлементное вычитание массивов;
- multiply — поэлементное умножение массив;
- divide, floor_devide — поэлементное деление массивов и поэлементное деление с отбрасыванием остатков от деления;
- maximum, fmax — поэлементный поиск максимумов и поэлементный поиск максимумов с игнорированием NaN (Not a Number);
- minimum, fmin — поэлементный поиск минимумов и поэлементный поиск минимумов с игнорированием NaN (Not a Number);
- mod — поэлементный поиск остатков от деления;
- copysign — копирование знаков элементов второго массива в элементы
первого массива; - greater, greater_equal, less, less_equal, equal, not_equal — поэлементное сравнение (эквивалентны операторам '>', '>=', '<', '<=' '==', '!=');
- logical_and, logical_or, logical_xor — вычисляет поэлементное значение истинности логической операций (эквивалентны операторам '&', '|', '^').
Пример
#!/usr/bin/python3
import numpy as np
nm1 = np.array([1, 2, 2])
nm2 = np.array([-1, -1, -1])
nm3 = np.array([2, 3, 4])
nm = np.copysign(nm1, nm2)
print(nm)
nmm = np.multiply(nm, nm3)
print(nmm)
Результат выполнения программы
[-1. -2. -2.]
[-2. -6. -8.]
Действия над массивами в numpy
Теперь продолжим рассматривать разные варианты работы с массивами в numpy.
Рассмотрим такое понятие как срезы. Будем говорить об одномерных массивах. На первый взгляд всё очень похоже на срезы в списках. Но не совсем. Рассмотрим пример
#!/usr/bin/python3
import numpy as np
m = np.array([2, 4, 6, 8, 10, 12, 14, 17])
print(m)
m1 = m[2:6]
print(m1)
m1[:] = -1
print(m1)
print(m)
Результат выполнения программы
[ 2 4 6 8 10 12 14 17]
[ 6 8 10 12]
[-1 -1 -1 -1]
[ 2 4 -1 -1 -1 -1 14 17]
Пояснения к программе.
- Ну, во-первых, обратим внимание на выражение m1[:] = -1, при выполнении всем элементам среза или всего массива (если бы m1 был массив) присваивается значение справа от знака равенства. Удобная возможность, не правда ли?
- Но самое важное вот что. Срез не является самостоятельным массивом. Это часть уже существующего массива. Поэтому изменение в срезе производит изменение и в массиве. Почему так сделано в numpy? Да чтобы экономить память и время. Библиотека numpy ведь изначально была рассчитана на быструю обработку больших объёмов информации. Здесь всё подчинено этой цели. Никакой лишней памяти, никакого лишнего копирования.
При этом вы всегда можете создать копию массива
mm = m.copy()
и mm станет копией массива m и совершенно самостоятельным объектом.
Интересно обстоит дело с многомерными массивами. Здесь всё очень похоже на то, как это работает во вложенных списках.
#!/usr/bin/python3
import numpy as np
m = np.array([[[2, 4], [6, 8]], [[10, 12], [14, 17]]])
print(m)
print('-----------')
print(m[0])
print('-----------')
print(m[0][1])
print('-----------')
print(m[0][1][0])
Результат выполнения программы
[[[ 2 4]
[ 6 8]]
[[10 12]
[14 17]]]
-----------
[[2 4]
[6 8]]
-----------
[6 8]
-----------
6
Пояснение к программе
Тут важно понять, какова размерность массива. В данном случае мы имеем дело с трёхмерным массивом numpy. Т.е. для определения элемента массива требуется три индекса. Элемент с двумя индексами дает одномерный массив, который является частью общего массива и частью двумерного. И, наконец, элемент с одним индексом является уже двумерным массивом. Большой массив состоит из двух таких массивов.
numpy, необычное присвоение
Ну одно такое присвоение я уже упомянул: m[:] = -1 - присваивает значение всем элементам массива.
Но можно написать и так
m[m>2] = -1
И всем элементам массива (любой размерности) будет присвоено значение -1, если этот элемент больше 2. Ну, а это совсем интересно
m[m%3 == 0] = -1
Всем элементам, которые делятся на 3 присваивается значение -1.
Можно выбрать элементы массива указав элементы значениями элементов другого массива, т.е. массив индексируется элементами другого массива.
#!/usr/bin/python3
import numpy as np
m = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
print(m[[1, 3, 5, 0]])
Результат выполнения
[2 4 6 1]
Т.е. мы таким образом просто указали, какие элементы массива мы берём.
Но это ещё не всё. Запись типа
m[[1, 3, 5, 0]] = -1
Присвоит элементам, индексы которых мы указали, значение -1.
Ну, пока всё!
Пишите свои предложения и замечания, и занимайтесь программированием, а также проектированием баз данных, хотя бы для поддержания уровня интеллекта.