Предварительное машинное обучение (3): освоение стандартного использования NumPy за 30 минут.

NumPy

NumPy поддерживает большое количество операций с размерными массивами и матрицами и является библиотекой Python для операций с массивами.

Эта статья включена вСерия предварительных руководств по машинному обучению.

1. Основы Python

Начнем с закрепления основ Python. Python имеет 6 стандартных типов данных: Number (число), String (строка),List(список), Tuple (кортеж), Set (коллекция), Dictionary (словарь).
в:
Неизменяемые данные: Number (число), String (строка), Tuple (кортеж).
Переменные данные: List (список), Dictionary (словарь), Set (коллекция).

1. Список[список]

список в квадратных скобках[ ]Пакет, стоимость каждой позиции переменная.

list = [1, 2, 3, 4, 5, 6]

Возьмите значение в соответствии с позицией, например, принимая значение второй позиции:

list[1]

получить2.
Берем значения с позиции 3, ко всем значениям в конце списка:

a[2:]

получить[3, 4, 5, 6].

Измените значение в указанной позиции:

list[0] = 9

Список a теперь выводится как[9, 2, 3, 4, 5, 6].

2. Кортеж

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

tuple = ('a', 'a, 'c', 1, 2, 3.0)

вывод('a', 'a', 'c', 1, 2, 3.0).
Возьмите элемент в последней позиции:

tuple[-1]

вывод3.0.

Работа с кортежем аналогична списку, но значение элементов в кортеже нельзя изменить, иначе будет сообщено об ошибке.

tuple[2] = 'caiyongji'

3. Набор {коллекция}

набор содержитНе повторяетсясовокупность элементов, заключенных в фигурные скобки{ }пакет.

set1 = {'a','b','c','a'}
set2 = {'b','c','d','e'}

Вывод set1:{'a', 'b', 'c'}.Примечание. Коллекции удаляют повторяющиеся элементы.
Вывод set2:{'b', 'c', 'd', 'e'}.

В отличие от списков и кортежей, наборы не могут быть подписаны, например:

set1[0]

Далее рассмотрим операции над множествами.

набор1 и набор2разница:

set1 - set2
#set1.difference(set2) 

вывод:{'a'}.

набор1 и набор2союз:

set1 | set2
#set1.union(set2) 

вывод:{'a', 'b', 'c', 'd', 'e'}.

набор1 и набор2перекресток:

set1 & set2
#set1.intersection(set2) 

вывод:{'b', 'c'}.

набор1 и набор2Симметричная разница:

set1 ^ set2 
#(set1 - set2) | (set2 - set1)
#set1.symmetric_difference(set2)

вывод:{'a', 'd', 'e'}.

Вышеупомянутые различия, объединения, пересечения и симметричные различия имеют соответствующие методы набора, вы можете аннотировать методы и попробовать их самостоятельно.

4. Словарь{словарь:Словарь}

Словарь — это отношение отображения, неупорядоченный набор пар ключ-значение. Словари не допускают дублирования ключей, но допускают дублирование значений.

dict = {'gongzhonghao':'caiyongji','website':'caiyongji.com', 'website':'blog.caiyongji.com'}

вывод словаря{'gongzhonghao': 'caiyongji', 'website': 'blog.caiyongji.com'}, следует отметить, что когда словарь содержит повторяющиеся ключи, последние элементы перезаписывают прежние элементы.

dict['gongzhonghao']

выходная строкаcaiyongji. Мы также можем использоватьgetметод имеет тот же эффект.

dict.get('gongzhonghao')

Посмотреть все ключи (ключи):

dict.keys()

выводdict_keys(['gongzhonghao', 'website']).

Посмотреть все значения (значение):

dict.values()

выводdict_values(['caiyongji', 'blog.caiyongji.com']).
Изменить стоимость предмета:

dict['website'] = 'caiyongji.com'
dict

вывод{'gongzhonghao': 'caiyongji', 'website': 'caiyongji.com'}.

Зная типы данных Python, мы можем научиться использовать NumPy.

2. Обычное использование Numpy

1. Создайте массив

import numpy as np
arr = np.array([1, 2, 3, 4, 5])

Выход обр.array([1, 2, 3, 4, 5]).

Мы вводим следующий код для создания двумерного массива:

my_matrix = [[1,2,3],[4,5,6],[7,8,9]]
mtrx= np.array(my_matrix)

Вывод mtrx выглядит следующим образом:

array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])

2. Индексирование и нарезка

Индексируйте одномерные массивы и двузначные массивы следующим образом:

print('arr[0]=',arr[0],'mtrx[1,1]=',mtrx[1,1])

выводarr[0]= 1 mtrx[1,1]= 5.

Разрезать массив:

arr[:3]

Выходarray([1, 2, 3]).

Обратный срез:

arr[-3:-1]

выводarray([3, 4]).

Добавьте шаг, определяющий интервал среза:

arr[1:4:2]

выводarray([2, 4]).

Срез двумерного массива:

mtrx[0:2, 0:2]

Вывод, смысл кода в том, чтобы взять 1-ю и 2-ю строки и 1-й и 2-й столбцы:

array([[1, 2],
       [4, 5]])

3. dtype

dtpe NumPy имеет следующие типы данных:

  • i - integer
  • b - boolean
  • u - unsigned integer
  • f - float
  • c - complex float
  • m - timedelta
  • M - datetime
  • O - object
  • S - string
  • U - unicode string
  • V - fixed chunk of memory for other type ( void )
import numpy as np
arr1 = np.array([1, 2, 3, 4])
arr2 = np.array(['apple', 'banana', 'cherry'])
print('arr1.dtype=',arr1.dtype,'arr2.dtype=',arr2.dtype)

Выходarr1.dtype= int32 arr2.dtype= <U6. Тип данных для arr1 — int32, а

Мы можем указать тип dtype.

arr = np.array(['1', '2', '3'], dtype='f')

бит результата выводаarray([1., 2., 3.], dtype=float32), где 1. означает 1.0, вы можете видеть, что для dtype задан тип данных float32.

4. Общий метод

4.1 arange

np.arange(0,101,2)Вывод следующий: команда указывает, что данные равномерно генерируются в интервале [0,101), а размер шага интервала равен 2.

array([  0,   2,   4,   6,   8,  10,  12,  14,  16,  18,  20,  22,  24,
        26,  28,  30,  32,  34,  36,  38,  40,  42,  44,  46,  48,  50,
        52,  54,  56,  58,  60,  62,  64,  66,  68,  70,  72,  74,  76,
        78,  80,  82,  84,  86,  88,  90,  92,  94,  96,  98, 100])

4.2 zeros

np.zeros((2,5))Результат вывода выглядит следующим образом: Команда указывает, что выводится матрица (двумерный массив) с 2 строками и 5 столбцами, в которых все нули.

array([[0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0.]])

4.3 ones

np.ones((4,4))Вывод выглядит следующим образом: Команда указывает, что выводится матрица со всеми единицами в 4 строках и 4 столбцах.

array([[1., 1., 1., 1.],
       [1., 1., 1., 1.],
       [1., 1., 1., 1.],
       [1., 1., 1., 1.]])

4.4 eye

np.eye(5)Вывод выглядит следующим образом: Команда указывает, что вывод представляет собой квадратную матрицу с 5 строками и 5 столбцами, диагональ которой равна 1, а все остальные — 0.Квадратная матрица — это матрица с одинаковыми строками и столбцами.

array([[1., 0., 0., 0., 0.],
       [0., 1., 0., 0., 0.],
       [0., 0., 1., 0., 0.],
       [0., 0., 0., 1., 0.],
       [0., 0., 0., 0., 1.]])

4.5 rand

np.random.rand(5,2)Команда генерирует случайные числа с 5 строками и 2 столбцами.

array([[0.67227856, 0.4880784 ],
       [0.82549517, 0.03144639],
       [0.80804996, 0.56561742],
       [0.2976225 , 0.04669572],
       [0.9906274 , 0.00682573]])

Если вы хотите, чтобы такое же случайное число, как в этом примере, генерировалось случайным образом, вы можете использовать то же случайное начальное число, что и в этом примере. пройти черезnp.random.seedнастройки метода.

np.random.seed(99)
np.random.rand(5,2)

4.6 randint

np.random.randint(0,101,(4,5))Вывод следующий, команда указывает, что она выбрана случайным образом в интервале [0,101)целое числоСоздает массив из 4 строк и 5 столбцов.

array([[ 1, 35, 57, 40, 73],
       [82, 68, 69, 52,  1],
       [23, 35, 55, 65, 48],
       [93, 59, 87,  2, 64]])

4.7 max min argmax argmin

Сначала мы случайным образом генерируем набор чисел:

np.random.seed(99)
ranarr = np.random.randint(0,101,10)
ranarr

вывод:

array([ 1, 35, 57, 40, 73, 82, 68, 69, 52,  1])

Просмотрите максимальное и минимальное значения как:

print('ranarr.max()=',ranarr.max(),'ranarr.min()=',ranarr.min())

Выходranarr.max()= 82 ranarr.min()= 1.
Индексные позиции максимального и минимального значений:

print('ranarr.argmax()=',ranarr.argmax(),'ranarr.argmin()=',ranarr.argmin())

вывод:ranarr.argmax()= 5 ranarr.argmin()= 0. Обратите внимание, что при наличии нескольких максимальных и минимальных значений берется предыдущая позиция индекса.

3. Расширенное использование NumPy

1. reshape

arr = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])
newarr = arr.reshape(4, 3)

Среди них arr — одномерный массив, а newarr — двузначный массив, где строка равна 4, а столбец — 3.

print('arr.shape=',arr.shape,'newarr.shape=',newarr.shape)

выводarr.shape= (12,) newarr.shape= (4, 3).

newarrРезультат выглядит следующим образом:

array([[ 1,  2,  3],
       [ 4,  5,  6],
       [ 7,  8,  9],
       [10, 11, 12]])

2. Слияние и разделение

2.1 concatenate

Объединение одномерных массивов:

arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])
arr = np.concatenate((arr1, arr2))
arr

вывод:array([1, 2, 3, 4, 5, 6]).

Объединение 2D-массивов:

arr1 = np.array([[1, 2], [3, 4]])
arr2 = np.array([[5, 6], [7, 8]])
arr = np.concatenate((arr1, arr2))
arr

Результат:


array([[1, 2],
       [3, 4],
       [5, 6],
       [7, 8]])

мы добавляем параметрыaxis=1:

arr1 = np.array([[1, 2], [3, 4]])
arr2 = np.array([[5, 6], [7, 8]])
arr = np.concatenate((arr1, arr2), axis=1)
arr

Результат:

array([[1, 2, 5, 6],
       [3, 4, 7, 8]])

мы подводим мышку кconcatenate, нажмите клавишу быстрого доступаShift+TabПосмотреть инструкции. можно увидетьconcatenateМетод выполняет операцию слияния вдоль существующей оси, ось по умолчанию = 0. Когда мы устанавливаем ось = 1, операция слияния выполняется по столбцам.

2.2 array_split

Разделить массив:

arr = np.array([[1, 2], [3, 4], [5, 6], [7, 8], [9, 10], [11, 12]])
newarr = np.array_split(arr, 3)
newarr

Значение newarr:

[array([[1, 2],
        [3, 4]]),
 array([[5, 6],
        [7, 8]]),
 array([[ 9, 10],
        [11, 12]])]

3. Поиск и фильтрация

3.1 Поиск

NumPy доступен черезwhereМетод находит индекс массива, удовлетворяющий условию.

arr = np.array([1, 2, 3, 4, 5, 6, 7, 8])
x = np.where(arr%2 == 0)
x

вывод:

(array([1, 3, 5, 7], dtype=int64),)

3.2 Скрининг

Давайте посмотрим на код ниже:

bool_arr = arr > 4
arr[bool_arr]

вывод:array([5, 6, 7, 8]). На этот раз мы возвращаем значение в массиве, а не индекс. Посмотримbool_arrЧто именно является содержанием .bool_arrРезультат:

array([False, False, False, False,  True,  True,  True,  True])

Таким образом, мы можем заменить приведенный выше фильтр следующей командой.

arr[arr > 4]

4. Сортировать

sortметод для сортировки массива ndarry.

arr = np.array(['banana', 'cherry', 'apple'])
np.sort(arr)

Вывести отсортированные результаты:array(['apple', 'banana', 'cherry'], dtype='<U6').

Для двумерных массивовsortспособ сортировки каждой строки по отдельности.

arr = np.array([[3, 2, 4], [5, 0, 1]])
np.sort(arr)

Выходной результат:

array([[2, 3, 4],
       [0, 1, 5]])

5. Случайный

5.1 Случайная вероятность

Что, если мы хотим выполнить следующие требования?

Создает одномерный массив из 100 значений, где каждое значение должно быть 3, 5, 7 или 9. Установите вероятность того, что это значение равно 3, равной 0,1. Установите вероятность этого значения от 5 до 0,3. Установите вероятность того, что это значение равно 7, равной 0,6. Установите вероятность этого значения от 9 до 0.

Мы решаем это с помощью следующей команды:

random.choice([3, 5, 7, 9], p=[0.1, 0.3, 0.6, 0.0], size=(100))

Выходной результат:

array([7, 5, 7, 7, 7, 7, 5, 7, 5, 7, 7, 5, 5, 7, 7, 5, 3, 5, 7, 7, 7, 7,
       7, 7, 7, 7, 7, 7, 5, 3, 7, 5, 7, 5, 7, 3, 7, 7, 3, 7, 7, 7, 7, 3,
       5, 7, 7, 5, 7, 7, 5, 3, 5, 7, 7, 5, 5, 5, 5, 5, 7, 7, 7, 7, 7, 5,
       7, 7, 7, 7, 7, 5, 7, 7, 7, 7, 3, 7, 7, 5, 7, 5, 7, 5, 7, 7, 5, 7,
       7, 7, 7, 7, 7, 3, 5, 5, 7, 5, 7, 5])

5.2 Случайное расположение

5.2.1 permutation

Создайте новую случайную перестановку из исходного массива.

np.random.seed(99)
arr = np.array([1, 2, 3, 4, 5])
new_arr = np.random.permutation(arr)
new_arr

Результат:array([3, 1, 5, 4, 2]). исходный массивarrпостоянный.

5.2.2 shuffle

Измените исходный массив на случайное расположение. Shuffle в переводе с английского означает перемешивание.

np.random.seed(99)
arr = np.array([1, 2, 3, 4, 5])
np.random.shuffle(arr)
arr

Результат:array([3, 1, 5, 4, 2]). исходный массивarrИзменять.

5.3 Случайное распределение

5.3.1 Нормальное распределение

использоватьnp.random.normalМетод генерирует случайные числа, соответствующие нормальному распределению.

x = np.random.normal(loc=1, scale=2, size=(2, 3))
x

Результат:

array([[ 0.14998973,  3.22564777,  1.48094109],
       [ 2.252752  , -1.64038195,  2.8590667 ]])

Если мы хотим увидеть случайное распределение x, нам нужно установить Seaborn для рисования изображения. Установить с помощью пипа:

pip install -i pypi.tuna.tsinghua.edu.cn/simple seaborn

import matplotlib.pyplot as plt
import seaborn as sns
sns.distplot(x, hist=False)
plt.show()

5.3.2 Биномиальное распределение

использоватьnp.random.binomialМетод генерирует случайные числа, соответствующие биномиальному распределению.

x = np.random.binomial(n=10, p=0.5, size=10)
x

Результат:array([8, 6, 6, 2, 5, 5, 5, 5, 3, 4]).

Нарисуйте изображение:

import matplotlib.pyplot as plt
import seaborn as sns
sns.distplot(x, hist=True, kde=False)
plt.show()

5.3.3 Полиномиальное распределение

Полиномиальное распределение является общим представлением биномиального распределения. использоватьnp.random.multinomialМетод генерирует случайные числа, соответствующие полиномиальному распределению.

x = np.random.multinomial(n=6, pvals=[1/6, 1/6, 1/6, 1/6, 1/6, 1/6])
x

Приведенный выше код мы можем просто понять как бросание игральных костей. n=6 — это грань игральной кости, а pvals означает, что вероятность каждой стороны равна 1/6.

5.3.4 Прочее

В дополнение к вышеперечисленным распределениям существуют распределение Пуассона, равномерное распределение, экспоненциальное распределение, распределение хи-квадрат, распределение Парето и т. д. Желающие могут поискать сами.


Эта статья включена вСерия предварительных руководств по машинному обучению. Приглашаем всех лайкнуть, добавить в избранное и подписаться. Постоянно обновляется более интересный контент о машинном обучении...