lsmagic
str='Vasya'
%timeit 'Hello, {}'.format(str)
%timeit 'Hello, %s' % str
%timeit?
https://docs.scipy.org/doc/numpy/reference/ - официальная документация
import numpy
#print(dir(numpy))
#print (numpy.linalg.__doc__)
# список всех модулей
#help("modules")
# справка по объекту
#help(numpy.ndarray)
numbers = [4, 8, 9, 2, 6]
strings = ["Hello", "World", "Test"]
mixed_list = ["Hello", 6, 7.8]
Метод append добавляет элемент в список. Можно набрать numbers., нажать табуляцию (после точки), и получить список доступных методов. Можно набрать help(list) или help(numbers) и получить краткое описание этих методов.
numbers.append(45)
print(numbers)
help(numbers.extend)
numbers.extend([4,6,7])
print(numbers)
#cравним = и extend
#%timeit num_1 = numbers + mixed_list
#%timeit num_2 = numbers.extend(mixed_list)
#numbers.clear()
numbers
Cоздадим копию списка numbers и изменим первый эелемент списка
copy = numbers
copy[0] = 45
copy
numbers
Что произошло?
Изменение элементов copy приведет к изменению numbers, и наоборот.
Для визуализации исполнения кода будем использовать сервис Python Tutor (http://www.pythontutor.com/)
%load_ext tutormagic
# Это магия, позволяющая вставить визуализацию с pythontutor прямо в этот notebook.
# Чтобы его использовать, необходимо установить пакет tutormagic
# pip install tutormagic
%%tutor --lang python3
first_list = [5, 8, 9, 'Hello']
second_list = first_list
second_list[0] = 777
В левой части наш код, зелёная стрелка — это команда, которая только что была выполнена, красная — это команда, которую сейчас предстоит выполнить; в правой части — мир имён (Frames) и мир платоновских идеальных объектов (Objects). Возможно, вам придётся воспользоваться горизонатльной прокруткой, чтобы увидеть платоновский мир. Нажимая на кнопку Forward, вы можете проследить, что происходит с вашим кодом.
Если мы хотим создать действительно новый список, то есть скопировать существующий, нужно использовать метод copy().
first_list = [6, 9, 2, 5]
third_list = first_list.copy()
print(third_list)
third_list[0] = 100
print(third_list)
print(first_list)
Как видите, теперь first_list и third_list ведут себя независимо. Этот код тоже можно визуализировать.
%%tutor --lang python3
first_list = [6, 9, 2, 5]
third_list = first_list.copy()
print(third_list)
third_list[0] = 100
print(third_list)
print(first_list)
Вы также можете встретиться с таким синтаксисом для копирования списков. [:] — это срез, начало которого совпадает с началом исходного списка, а конец — с концом. Такой код вы часто встречается в программах, написанных на Python 2, потому что там не было метода copy()
first_list = [6, 9, 2, 5]
other_list = first_list[:]
other_list
Информация про массивы https://docs.scipy.org/doc/numpy/reference/arrays.html
В Python атрибуты отдельного объекта обозначаются как name_of_object.attribute
ndarray.ndim — число осей (измерений) массива. Как уже было сказано, в мире Python число измерений часто называют рангом.
ndarray.shape — размеры массива, его форма. Это кортеж натуральных чисел, показывающий длину массива по каждой оси. Для матрицы из n строк и m столбов, shape будет (n,m). Число элементов кортежа shape равно рангу массива, то есть ndim.
ndarray.size — число всех элементов массива. Равно произведению всех элементов атрибута shape.
ndarray.dtype — объект, описывающий тип элементов массива. Можно определить dtype, используя стандартные типы данных Python. NumPy здесь предоставляет целый букет возможностей, например: bool, character, int, int8, int16, int32, int64, float, float8, float16, float32, float64, complex, complex64, object_.
ndarray.itemsize — размер каждого элемента массива в байтах. Например, для массива из элементов типа float64 значение itemsize равно 8 (=64/8), а для complex32 этот атрибут равен 4 (=32/8).
ndarray.data — буфер, содержащий фактические элементы массива. Обычно нам не будет нужно использовать этот атрибут, потому как мы будем обращаться к элементам массива с помощью индексов.
import numpy as np
Объект массив в Numpy - это np.array (на самом деле он называется np.ndarray).
np.array — это специальный тип данных, похожий на список, но содержащий данные только одного типа
Набор функций Numpy для создания массивов https://docs.scipy.org/doc/numpy/reference/routines.array-creation.html
# help(numpy.array)
#numbers = [4, 8, 9, 2, 6]
print(numbers)
np_numbers = np.array(numbers)
numbers
np_numbers
print(numbers)
np_bool = np.array(numbers, dtype=bool)
np_bool
Функция принимает кортеж с размерами, и аргумент dtype
np.zeros((3, 5))
np.ones((2, 2, 2))
np.eye(5)
np.empty((3, 3))
np.arange(10, 30, 5)
#np.arange(0, 1, 0.1)
# 9 чисел от 0 до 2 включительно
np.linspace(0, 2, 9)
def f1(i, j):
return 3 * i + j
np.fromfunction(f1, (3, 4))
np.fromfunction(f1, (3, 3))
#help(np.random.rand)
np.random.rand(3)
#np.random.rand(2,3)
При выводебольших массивов центральная часть скрывается автоматически. Для настройки выводы используется функция np.set_printoptions
# np.set_printoptions(threshold=1000) по умолчанию
print(np.arange(0, 3000, 1))
# np.set_printoptions(threshold=np.nan)
print(np.arange(0, 3000, 1))
Практически все операции выполняются поэлементно.
Список операций https://docs.scipy.org/doc/numpy/reference/arrays.ndarray.html#arithmetic-matrix-multiplication-and-comparison-operations
# Например, возведение в квадрат каждого элемента
np_numbers**2
Сравним умножение для списков и массивов
np_numbers*2
numbers*2
# упростим, чтобы не писать каждый раз np.
# Команда from ... import позволяет импортировать не весь модуль целиком, а только определенное его содержимое
from numpy import array
a = array([1,2,3,4])
# обращение к элементу массива (??? a[5])
a[3]
# изменение элемента массива
a[0] = 12
a
# итерация элементов
for x in a:
print(x)
Все арифметические операции над массивами выполняются поэлементно. Поэтому + означает сложение, а не конкатенацию, в отличие от обычных списков.
# сложение (!!! массивы одинаковой длины)
b = array([2, 3, 6, 10])
a+b
# и конкатенация
np.concatenate( [a, b])
Математические операции из библиотеки numpy https://docs.scipy.org/doc/numpy/reference/routines.math.html
# экспонента для каждого элемента массива a
np.exp(a)
np.sqrt(a)
Все элементы, лежащие в одном массиве, должны быть одного типа. Параметр dtype содержит информацию о типе объектов, хранящихся в массиве. <U5 означает юникодную строку длиной максимум 5 байт. При попытке записать более длинную строку она будет обрезана.
mixed_array = np.array(mixed_list)
mixed_array
mixed_array[0]='HelloHello'
mixed_array
# np.array([1,2,3]) целые
array([1,2,3])
# вещественные
array([1,2.,3])
q = a[1:3]
q
# изменим значение элемента в срезе
q[0] = 25
q
a
В numpy создание среза ничего не копирует: срез — это не новый массив, содержащий те же элементы, что старый, а так называемый view (вид), то есть своего рода интерфейс к старому массиву. Грубо говоря, наш срез s просто помнит, что «его» элемент с индексом 0 — это на самом деле элемент с индексом 1 от исходного массива x, а его элемент с индексом 1 — это на самом деле элемент с индексом 2 от исходного массива, а других элементов у него нет. Можно думать про срез как про такие специальные очки, через которые мы смотрим на исходный массив.
Преимущество и этого подхода два: во-первых, непосвященные сломают голову, пытаясь понять, что тут происходит, а во-вторых если у нас есть огромный массив данных, то нам не придётся тратить ресурсы на то, чтобы его скопировать, если нам нужно сделать срез. Недостатки тоже есть, но они являются продолжением первого из преимуществ.
Если вам всё-таки нужно сделать копию массива, нужно использовать метод copy().
c = a.copy()
c[0]=5
c
a
# выбор элемента с нужным номером
print(a)
d = a[ [1, 3] ]
d
# использование одинаковых номеров
print(a)
d = a[ [1, 1, 1] ]
d
Допустим, мы хотим выбрать только те элементы, которые обладают каким-то свойством — скажем, меньше 50. Можно было бы использовать цикл с условием
# выбор по условию
print(a)
d = a[ a < 12 ]
d
# операция сравнения применяется ко всему массиву a
a<12
# затем массив подставляется в качестве индексов
a[[False, False, True, True]]
# несколько условий сразу | (ИЛИ), ~(НЕ)
a[ (a < 12) & (a > 3) ]
# замена элементов по условию
a[ (a < 12) & (a > 3) ] = 0
a
# сравнение массивов
np.array([1, 2, 3]) == np.array([1, 2, 3])
# метод all(), возвращающий истину только если все элементы являются истиными
(np.array([1, 2, 3]) == np.array([1, 2, 3])).all()
# есть специализированная функция для проверки на равенство
np.array_equal(np.array([1, 2, 3]), np.array([1, 2, 3]))