Hands Numpy вводное руководство [два] - срез массива

машинное обучение

Эта статья возникла из личного публичного аккаунта:TechFlow, оригинальность это не просто, прошу внимания


СегодняВторая часть темы Numpy, давайте перейдем к делу и посмотрим на операции Numpy.

Как было сказано в предыдущей статье, при одинаковом объеме данных скорость работы с использованием Numpy будет в сотни и более раз, чем при самостоятельном написании цикла. И API Numpy очень прост, обычно всего несколько строк кода могут выполнять очень сложные операции.

Компьютеры и радиовещание

Независимо от того, какой тип массива в Python, мы не можем напрямую вычислить все элементы в нем. Для этого вы должны действовать таким образом, как карта. В Numpy мы можем легкоВыполнение различных вычислений на всем массиве или матрице.

Во-первых, давайте определим массив Numpy:

arr = np.array([[1,2,3],[2,2,3]])
image-20200516161939969
image-20200516161939969

Во-первых, давайте рассмотрим четыре основные операции:

image-20200516162021455
image-20200516162021455

На этой картинке мы видим две точки, первая — это массив в Numpy.Перегружены четыре оператора, мы можем напрямую вычислить путем сложения, вычитания, умножения и деления. Второй момент заключается в том, что Numpy автоматически выполняет сопоставление за нас.Хотя объектом нашей операции является сам массив, Numpy автоматически сопоставляет каждый элемент для нас.

Если вам не нравятся прямые операции и вы хотите использовать API Numpy для совершения звонков, это то же самое. Numpy также предоставляет API для сложения, вычитания, умножения и деления.

image-20200516162427254
image-20200516162427254

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

image-20200516162534018
image-20200516162534018

В дополнение к перечисленным, Numpy также предоставляет множество других API для различных вычислений, включая почти все распространенные формулы математических вычислений. Например, log, exp, pow, квадратный корень, тригонометрические функции и т. д., в основном названия апи такие же, как и в математике, и запоминать их всем не нужно, в основном их можно отгадать по Английский. Вообще говоря, запомните наиболее часто используемые из них.

транслировать

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

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

Например, если мы хотим добавить 3 к каждому элементу массива в Numpy, мы, конечно, можем создать массив того же размера, а затем сложить их вместе. Но нет необходимости быть таким хлопотным.Мы можем напрямую добавить 3 к исходному массиву.Numpy обнаружит, что размер 3 несовместим с нашим размером данных, а затем автоматически поможет нам расширить 3 до массива того же размера, что и наши данные перед расчетом:

image-20200516162846508
image-20200516162846508

На самом деле это эквивалентно:

np.full_like(arr, 3) + arr

Если вы можете понять вышеописанную операцию, то точно так же нам нужно возвести в квадрат или возвести в квадрат все элементы:

image-20200516163141477
image-20200516163141477

Вещание можно использовать не только между массивом и целым числом, но иИспользуется в массиве и другом меньшем массивеСреди них, но будут требования к форме обоих. Numpy предусматривает, что форма двух массивов должна быть равна или один из них должен быть равен 1 для выполнения операции вещания.

Например, только что созданный нами массив arry имеет форму (3, 2), мы можем позволить ему работать с «маленьким массивом» размера (1, 2) или (3, 1), что также поддерживается.

Если вы не понимаете приведенный выше процесс расчета, я продемонстрирую его на картинке.

image-20200516164211467

Из рисунка видно, что форма массива слева — (2, 3), а форма массива справа — (2, 1), что соответствует требованиям Numpy к механизму вещания. Numpy будет автоматически транслировать размерность правильного массива, форма которого равна 1, то есть он будетсделать несколько копийсделать их формы равными. Если представить массив слева как количество людей, слушающих трансляцию, а массив справа как сообщение, то механизм трансляции заключается в многократном копировании сообщения, чтобы все, кто слушает трансляцию, могли его услышать. тот же контент. Так что имя до сих пор очень живое.

кусочек

Одна из самых важных особенностей массивов в Python заключается в том, что ихоперация срезаОчень удобно, Numpy, как вычислительный пакет на основе Python, естественно наследует это, поэтому в Numpy мы также можем легко использовать функцию slice. Нарезка в основном такая же, как в Python.

Мы используем нижние индексы и двоеточия, чтобы указать диапазон, который мы хотим разрезать, который, как и Python, представляет собой интервал, закрытый слева и открытый справа.

Мы также можем опустить один из диапазонов и указать только верхние или нижние границы:

image-20200516165031942
image-20200516165031942

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

image-20200516165127699
image-20200516165127699

Но есть одно отличие: слайсы в Numpy похожи на слайсы в golang, они представляют собой сегмент исходного массива.Цитировать, а не копия. То есть, если мы изменим содержимое среза, это повлияет на исходный массив.Если мы присвоим значение срезу, мы, очевидно, обнаружим, что соответствующая позиция исходного массива изменилась.

image-20200516165245162
image-20200516165245162

Причина для этого дизайна та же, что и у golang, потому что Numpy был создан для вычислений больших данных Очевидно, что производительность является очень важным фактором для вычислений больших данных. Если он задуман не как ссылка, а как копия, то при генерации большого среза он неизбежно будетВключает большое количество копийоперация. Он не только очень интенсивно использует память, но и потребляет много вычислительных ресурсов. Если вы используете ссылку, вы можете вернуть результат очень быстро.

То же самое верно для этого дизайна в Голан.

Вопрос в том, что если мы хотим скопировать слайс, а не получить слайс? Ответ также очень прост, мы можем вызвать метод копирования, чтобы получить копию.

arr[3:10].copy()

показатель

Теперь, когда мы понимаем использование срезов, давайте посмотрим на индексы. Индексирование также является очень важным понятием в Numpy, и его применение также очень распространено.

Индекс в Numpy соответствует измерению в массиве, например двумерному массиву.Когда мы обращаемся к нему с помощью нижнего индекса, мы получаем фактически одномерный массив. Поэтому, если мы хотим получить доступ к определенному элементу, все, что мы можем сделать, это продолжить указывать индекс вниз:

image-20200516171154055
image-20200516171154055

Это легко понять, и это то же самое, что и использование многомерных массивов в Python. Выше мы использовали две квадратные скобки, чтобы зафиксировать позицию элемента, для удобства записи мы также можемРазделяйте запросы запятыми. Дружеское напоминание: нативные массивы Python не поддерживают такие операции, так что не путайте их.

Точно так же, если это многомерный массив, то же самое, мы выписываем координаты от 0 до k измерений по очереди, чтобы получить фиксированный элемент. Если мы дадим меньше информации о координатах, то получим массив.

Возьмем в качестве примера трехмерный массив, если мы получим к нему доступ только с одним нижним индексом, то получим двумерный массив. Если вы используете два индекса, вы получите одномерный массив. То же верно и для более высоких измерений.

конец

В сегодняшней статье мы узнали об общих вычислительных API и механизмах вещания и индексирования в Numpy. Использование индексов — это только начало, и есть много очень гибких применений. Из-за нехватки места мы разделили их на несколько статей. в последующих статьях.

Сегодня также представлен основной контент Numpy.За исключением механизма вещания, над которым нужно немного подумать, остальное должно быть очень простым.Я думаю, что каждый может понять это. Причина, по которой Numpy популярен, заключается в том, что в дополнение к его высокой скорости его API прост в использовании, а стоимость обучения низкая.

Следуйте за мной для других больших статей.