Dangdang, я снова открыл новую яму, На этот раз тема очень важный инструментарий в машинном обучении Python, который является знаменитымnumpy.
Итак, сегодняшняя статьяПервая статья темы Numpy.
Как говорится, если вы хотите получать удовольствие от машинного обучения, вам не нужно писать Python, но вы не должны уметь настраивать библиотеку (большой туман). Можно сказать, что Numpy является самой базовой и важной библиотекой инструментов в Python.Чтобы использовать Python для машинного обучения и играть с различными фреймворками, Numpy является обязательным. Все известные фреймворки, такие как TensorFlow и pytorch, основаны на Numpy для вычислений, и его важность можно себе представить.
Необходимость существования Numpy
В Интернете есть много вводных сведений о Numpy, но это не более чем очень важный базовый пакет для числовых вычислений в Python, который можно использовать для легкого выполнения некоторых операций с матрицами и большими данными.
Мы понимаем, что делает Numpy, но нам это может быть интереснее.более глубокое значениеЧто именно? Мы продолжали задавать этот вопрос от поверхностного до глубокого, и мы могли получить много разных ответов.
Самый поверхностный ответ прост, Numpy удобен,Быстрый расчет, вы можете легко выполнять матричные операции. На курсе Эндрю однажды продемонстрировал, что та же матричная операция, если мы реализуем ее через цикл в Python, будет как минимум в сто раз медленнее, чем вызов Numpy. Разница, очевидно, очень страшная.
Но почему Numpy быстрее?
Если мы продолжим спрашивать, мы получим новый ответ. Поскольку пакет NumpyНижний слой реализован на C++., очевидно, операции C++ намного быстрее, чем Python, поэтому Numpy, естественно, быстрее.
Является ли Numpy только потому, что С++ быстрее?
Этот вопрос вышел за рамки самого Numpy, и нам нужно ответить на него, исходя из характеристик Python. Python — это интерпретируемый язык, а это означает, что когда мы запускаем Python, мы фактически запускаем интерпретатор Python. Каждая строка кода Python интерпретируется и выполняется интерпретатором Python.
Если мы понимаем интерпретатор как виртуальную машину, код, выполняемый Python, понимается как программа на виртуальной машине. Если мы откроем больше виртуальных машин, будет сложно обеспечить потокобезопасность. Чтобы решить эту проблему, Python разработалГИЛ механизм, то есть глобальная блокировка интерпретатора, которая гарантирует, что одновременно выполняется не более одного потока интерпретатора.
Этот механизм гарантирует безопасность потоков, но также ограничивает использование многопоточности Python. Многопоточность Python по сути является псевдомногопоточностью, потому что у интерпретатора работает только один поток. Поэтому, если мы хотим ускорить вычисления за счет многопоточности, это невозможно.
Некоторые операции с матрицами и векторами можно ускорить за счет многопоточного параллелизма, а характеристики самого Python не позволяют Python выполнять такие операции. Тогда единственным выбором будет вычислительная библиотека, реализованная путем вызова C++ через Python. На самом деле не только Numpy, но и почти все вычислительные библиотеки Python реализованы за счет вызова других языков из Python. Python сам по себе является просто вызывающей программой верхнего уровня.
Помимо более четкого понимания Python, понимание этого также поможет вам изучить другие фреймворки, такие как TensorFlow, в будущем.
n-мерный массив в Numpy
Numpy прост в использовании, потому что мы можем использовать NumpyЛегко создавайте многомерные массивы и матрицы.
Например, в родном Python, когда нам нужно создать двумерный массив, нам часто нужны очень длинные определения. Скажем, нам нужен массив 10*10:
arr = [[0 for _ in range(10)] for _ in range(10)]
Зато в Numpy будет очень удобно, требуется всего одна строчка.
import numpy as np
arr = np.zeros((10, 10))
В первой строке мы ввели numpy, который для удобства кодирования переименовали в np. Это обычная практика в отрасли, и почти все программисты, использующие numpy, будут переименовывать его таким образом.
В numpy объекты, в которых хранятся многомерные массивы, называются ndarrays, что соответствует матам, в которых хранятся матрицы. На самом деле разница между ними невелика, они поддерживают матричные операции, а ndarray в основном их поддерживает. У нас может сложиться такое впечатление, а содержание мата мы представим позже.
После того, как мы создадим ndarray, у нас есть следующие четыре API для получения базовой информации о ndarray.
первыйчерез .ndimПроверяем размерности ndarray, то есть проверяем, что это массив из нескольких измерений:
Второйчерез .shapeПолучите размер этого ndarray в каждом измерении:
Третийчерез .dtypeПолучите тип элементов в этом ndarray:
Последний из нихметод tolist(), вы можете преобразовать ndarray в собственный список Python для возврата.
ndarray
Итак, как мы создаем NDARRAY в Numpy?
Вероятно, есть несколько способов: во-первых, поскольку NDARRAY в Numpy можно преобразовать в собственный список Python, исходный LIST в Python также можно преобразовать в NUMPY NDARRAY.
Подобно синтаксису преобразования типов переменных, мы можем преобразовать их с помощью np.array().
nums = [1, 3, 4, 6]
arr = np.array(nums)
В дополнение к собственному преобразованию списков в Python мы также можем создавать новые ndarrays в соответствии с нашими потребностями. Есть много способов создания массивов в numpy, давайте сначала представим некоторые из наиболее простых.
создать диапазон
np.arange можетгенерировать последовательность, чем-то похожий на собственный диапазон в Python. Однако это более гибко, мы можем передать целое число, и оно вернет последовательность, основанную на 0:
np.arange(10)
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
мы также можемУкажите первый и последний элементы и интервал, numpy автоматически сгенерирует для нас арифметическую последовательность:
np.arange(1, 5, 0.5)
array([1. , 1.5, 2. , 2.5, 3. , 3.5, 4. , 4.5])
В дополнение к этому, numpy также предоставляетединицы и нулиДва API, которые могут генерировать элементы со всеми нулями и всеми единицами.
np.zeros((3, 4))
array([[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.]])
np.ones((2, 3))
array([[1., 1., 1.],
[1., 1., 1.]])
мы также можем использоватьглаз или личностьСоздайте матрицу идентичности N * N:
np.eye(3)
array([[1., 0., 0.],
[0., 1., 0.],
[0., 0., 1.]])
Кроме того, есть полный API, который можетУкажите форму и значение, заполняем массив заданного размера указанными нами значениями:
np.full((3, 4), 3)
array([[3, 3, 3, 3],
[3, 3, 3, 3],
[3, 3, 3, 3]])
Но мы не часто используем этот API, потому что мы можем использовать единицы для создания массива всех единиц, а затем умножать на желаемое значение, которое эквивалентно полному.
Кроме того, API единиц, нулей и полных также имеют соответствующий метод like. Так называемый метод like заключается в том, что мы передаем другой ndarray вместо shape, и numpy сгенерирует новый массив соответствующей формы в соответствии с формой этого ndarray.
Давайте посмотрим на пример, сначала мы генерируем последовательную последовательность:
ex1 = np.arange(10)
Затем генерируем матрицу того же размера со всеми нулями методом zeros_like:
ex2 = np.zeros_like(ex1)
На самом деле это эквивалентно:
np.zeros(ex1.shape)
Несколько других подобных методов похожи, потому что они очень заменяемы, поэтому я не использую их часто.
Типы, поддерживаемые numpy
Numpy поддерживает множество типов данных, в дополнение к обычно используемым типам int и float, он также поддерживаеткомплекс сложного типа, в какой-то степени он близок к типу, поддерживаемому golang.
Тип int делится на int8, int32, int64 и int128, каждый из которых делится на signed и unsigned. Например, int8 — это 8-битное двоичное представление int со знаком, а uint8 — беззнаковое. Для чисел с плавающей запятой не существует беззнаковых чисел с плавающей запятой, и они делятся на float16, float32, float64 и float128.
Есть также три типа комплексных чисел: комплексные64, комплексные128 и комплексные256. Кроме того, есть три типа string_ и object и unicode_.
Мы можем изменить тип всех переменных в ndarray, вызвав метод astype:
ex1 = np.arange(10)
ex1.astype(np.float64)
array([0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])
В дополнение к искусственному преобразованию мы также можем использовать параметр dtype, чтобы указать тип данных, которые мы хотим создать при создании, что может избежать проблем с последующим преобразованием.
ex1 = np.arange(10, dtype=np.float32)
конец
В этой статье мы не только представили метод создания Numpy, но и рассказали о некоторых особенностях языка Python. Именно из-за ограничений многопоточности самого Python его производительность низка в сценариях, требующих большого количества одновременных вычислений. Необходимо вызывать C++ или базовую реализацию других языков через Python. Вот почему Python часто называютклей языкпричина.
Numpy можно рассматривать как основу для машинного обучения в Python.Конечно, помимо Numpy, также важны такие библиотеки, как pandas, matplot и scikit-learn. Мы начнем с Numpy и постепенно поделимся с вами этими часто используемыми библиотеками.
Дамы и господа, если вам понравилось, подписывайтесь~