NumPy Trace | Matrix Explorer of the Python
numpy.trace(a, offset=0, axis1=0, axis2=1, dtype=None, out=None) может найти сумму всех элементов диагонали матрицы
Python имеет мощный модуль Numpy. В то же время его специализация-наука о данных, используемая во многих отношениях. Встроенные функции универсальны. Поэтому мы предоставляем вам учебные пособия по его различным частям для практики. В этом мы увидим о numpy trace. В основе его лежит работа с матрицей, так что новое поле работает с python.
Метод Numpy matrix.trace(), мы можем найти сумму всех диагональных элементов матрицы с помощью метода matrix.trace (). Этот метод возвращает сумму по диагоналям массива. Сумма вместе с диагональю возвращается для 2D-массива с заданным смещением с использованием этого метода.
Согласно href=”https://numpy.org/doc/stable/reference/generated/numpy.trace.html”>NumPy.org, когда массив имеет более двух измерений, мы используем оси, заданные axis1 и axis2. Эти оси определяют 2-D подмассивы, затем метод находит их следы. Форма результирующего массива такая же, как у a с удаленными axis1 и axis2. href=”https://numpy.org/doc/stable/reference/generated/numpy.trace.html”>NumPy.org, когда массив имеет более двух измерений, мы используем оси, заданные axis1 и axis2. Эти оси определяют 2-D подмассивы, затем метод находит их следы. Форма результирующего массива такая же, как у a с удаленными axis1 и axis2.
Синтаксис Numpy Trace
Синтаксис со всеми параметрами таков:
Но мы обычно используем только:
Параметры, используемые в Numpy Trace
| Параметр | Обязательная или нет матрица |
| a | обязательный |
| смещение | необязательный |
| axis1 | необязательный |
| axis2 | необязательный |
| dtype | необязательный |
| из | необязательный |
a: Array_like/matrix
“а” – это основной параметр. Этот вход—это все, что достаточно для оценки-входной массив или объект. Метод проверяет элементы массива. Этот массив считается матрицей и записывается в таком виде.
смещение
Смещение диагонали от главной диагонали. Может быть как положительным, так и отрицательным. По умолчанию установлено значение 0.
axis1/axis2
Первая и вторая оси 2D-суб-массивов-это оси, обеспечивающие требуемые диагонали. Значения по умолчанию-это первые две оси a. Тип данных – int.
dtype
Этот параметр определяет тип данных возвращаемого массива, а накопитель суммирует элементы. Если dtype имеет значение None и a имеет целочисленную точность меньше целочисленной точности по умолчанию, то используйте целочисленную точность по умолчанию. В противном случае точность такая же, как у a.
Тип данных array_like и необязателен для использования. Этот параметр делает выходной массив с теми же размерами, что и входной массив, помещенный вместе с результатом. Он имеет ту же форму, что и планируемое выступление, и сохраняет свою форму. Массив задает выходные данные. Параметр сохраняет свой тип, и он должен иметь правильную форму, чтобы удерживать результат.
Возвращаемое значение numpy trace
Верните сумму по диагоналям массива. В виде ndarray как
sum_along_diagonals. Если a 2-D, то мы получаем сумму по диагонали. Если a имеет большие размеры, то возвращается массив сумм по диагоналям.
Примеры для понимания
во-первых, мы импортируем numpy как:
затем мы либо создаем массив, либо непосредственно используем его с помощью метода trace:
Вы можете получить другой тип вывода, если сделаете это следующим образом:
Теперь вы легко поймете метод трассировки.
Что дальше?
NumPy очень мощен и невероятно важен для информатики в Python. Это правда, если вы интересуетесь наукой о данных в Python, вам действительно следует узнать больше о Python.
Возможно, вам понравятся наши следующие учебники по numpy.
Вывод
Все еще есть какие-либо сомнения или вопросы, дайте мне знать в разделе комментариев ниже. Я постараюсь помочь вам как можно скорее.
numpy.traceВ¶
Return the sum along diagonals of the array.
If a is 2-D, the sum along its diagonal with the given offset is returned, i.e., the sum of elements a[i,i+offset] for all i.
If a has more than two dimensions, then the axes specified by axis1 and axis2 are used to determine the 2-D sub-arrays whose traces are returned. The shape of the resulting array is the same as that of a with axis1 and axis2 removed.
a : array_like
Input array, from which the diagonals are taken.
offset : int, optional
Offset of the diagonal from the main diagonal. Can be both positive and negative. Defaults to 0.
axis1, axis2 : int, optional
Axes to be used as the first and second axis of the 2-D sub-arrays from which the diagonals should be taken. Defaults are the first two axes of a.
dtype : dtype, optional
Determines the data-type of the returned array and of the accumulator where the elements are summed. If dtype has the value None and a is of integer type of precision less than the default integer precision, then the default integer precision is used. Otherwise, the precision is the same as that of a.
out : ndarray, optional
Array into which the output is placed. Its type is preserved and it must be of the right shape to hold the output.
sum_along_diagonals : ndarray
If a is 2-D, the sum along the diagonal is returned. If a has larger dimensions, then an array of sums along diagonals is returned.
Вычислить след матрицы по всем диагоналям
Мне нужно вычислить след матрицы по всем ее диагоналям. То есть для матрицы nxm операция должна создать n + m-1 «следов». Вот пример программы:
Программа Cython превосходит программу, проходящую через np.trace:
Итак, в основном я хочу получить обратную связь о том, был ли более эффективный способ использования подпрограмм numpy / scipy, или я, вероятно, достиг наиболее быстрого способа использования cython.
7 ответов
Вот улучшенная версия вашей функции Cython. Честно говоря, вот как я это сделаю, если Cython является опцией.
Это будет значительно быстрее, чем версия, которую вы даете в своем вопросе, потому что он перебирает массив в том порядке, в котором он хранится в памяти. Для небольших массивов два подхода почти одинаковы, хотя этот способ на моей машине немного быстрее.
Я написал эту функцию так, чтобы она требовала C-смежного массива. Если у вас есть непрерывный массив Fortran, транспонируйте его, а затем измените порядок вывода.
Это возвращает ответы в обратном порядке от функции, показанной в вашем примере, поэтому вам нужно будет изменить порядок массива, если порядок особенно важен.
Вы также можете улучшить производительность, компилируя с более тяжелыми оптимизациями. Например, вы можете создать свой код Cython в записной книжке IPython с дополнительными флагами компилятора, заменив
Если ваша матричная форма достаточно далека от того, чтобы быть квадратной, то есть, если она высокая или широкая, то вы можете эффективно использовать приемы шага для этого. В любом случае вы можете использовать трюки с шагами, но это может быть неэффективно при использовании памяти, если матрица близка к квадратной.
Что вам нужно сделать, это создать новое представление массива для тех же данных, которое построено таким образом, что шаг при переходе от одной строки к следующей также вызывает приращение в столбце. Это достигается путем изменения шагов массива.
Проблема, о которой нужно позаботиться, лежит на границах массива, где нужно заполнять нулями. Если массив далеко не квадратный, это не имеет значения. Если это квадрат, то нам нужно удвоить размер массива для заполнения.
Если вам не нужны меньшие следы по краям, то вам не нужно дополнять нулями.
Здесь идет (предполагая больше столбцов, чем строк, но легко адаптируется):
Чтобы соответствовать выводу, который вы показываете в своем примере, вы должны изменить его (см. Комментарий @larsmans)
Это конкретный пример с конкретными цифрами. Если это полезно для вашего варианта использования, я могу превратить его в общую функцию.
Это конкурентоспособно, если массив большой:
Этот метод имеет высокую чувствительность к отношению столбца / строки массива, потому что это отношение определяет, сколько циклов выполняется в Python относительно Numpy. Как отметил @Jaime, эффективно перебирать наименьшее измерение, например:
Но следует отметить, что при больших размерах массива (например, 100000 x 500 в моей системе) доступ к массиву строка за строкой, как в первом опубликованном коде, может быть еще быстрее, возможно, из-за того, как массив размещен в ОЗУ (быстрее извлекать смежные куски, чем разложенные).
Если вы хотите держаться подальше от Cython, построение массива диагональных индексов и использование np.bincount могут помочь:
По моим примерам, для вашего примера ввода, это в 4 раза быстрее, чем ваш оригинальный чистый метод Python. Поэтому я не думаю, что это будет быстрее, чем ваш код на Cython, но вы можете захотеть рассчитать время.
Это можно сделать (слегка оскорбительно), используя scipy.sparse.dia_matrix двумя способами, один более редкий, чем другой.
Первый, дающий точный результат, использует вектор dia_matrix хранимых данных
Менее ресурсоемким методом будет работать наоборот:
Обратите внимание, что в этом решении отсутствуют две записи. Это может быть исправлено умным способом, но я еще не уверен.
Python Matrix — учебное пособие по матрицам
Мы можем реализовать матрицу Python в форме 2-го списка или 2-го массива. Для выполнения операций с Python Matrix нам необходимо импортировать Python NumPy Module.
Matrix важен в области статистики, обработки данных, обработки изображений и т. д.
Создание матрицы Python
Матрицу Python можно создать одним из следующих способов:
1 С использованием списков
numpy.array() можно использовать для создания массива, используя списки в качестве входных данных.
Как видно выше, выходные данные представляют собой двумерную матрицу с заданным набором входных данных в виде списка.
2 С помощью функции numpy.arange()
numpy.arange() вместе со списком входов.
3 С помощью функции numpy.matrix().
Сложение
Операцию сложения матриц можно выполнить следующими способами:
1 Традиционный метод
В этом традиционном методе мы в основном берем ввод от пользователя, а затем выполняем операцию сложения с использованием циклов for (для обхода элементов матрицы) и оператора ‘+’.
Примечание. Matrix.shape возвращает размеры конкретной матрицы.
2 Использование оператора «+»
Этот метод обеспечивает большую эффективность кода, поскольку он уменьшает LOC (количество строк кода) и, таким образом, оптимизирует код.
Умножение матриц
Умножение матриц в Python можно обеспечить следующими способами:
Скалярное произведение
В скалярном произведении постоянное значение умножается на каждый элемент матрицы.
Оператор ‘*’ используется для умножения скалярного значения на элементы входной матрицы.
Функция numpy.dot()
Функция numpy.dot() принимает массивы NumPy в качестве значений параметров и выполняет умножение в соответствии с основными правилами умножения матриц.
Вычитание
Оператор ‘-‘ используется для выполнения вычитания матриц.
Деление
Скалярное деление может выполняться на элементах матрицы в Python с помощью оператора ‘/’.
Оператор ‘/’ делит каждый элемент матрицы на скалярное / постоянное значение.
Транспонирование матрицы
Транспонирование матрицы в основном включает в себя переворачивание матрицы по соответствующим диагоналям, т. е. Меняет местами строки и столбцы входной матрицы. Строки становятся столбцами и наоборот.
Например: давайте рассмотрим матрицу A с размерами 3 × 2, т.е. 3 строки и 2 столбца. После выполнения операции транспонирования размеры матрицы A будут 2 × 3, т.е. 2 строки и 3 столбца.
Matrix.T основном выполняет транспонирование входной матрицы и создает новую в результате операции транспонирования.
В приведенном выше фрагменте кода я создал матрицу размером 2 × 5, т.е. 2 строки и 5 столбцов.
После выполнения операции транспонирования размеры результирующей матрицы составляют 5 × 2, то есть 5 строк и 2 столбца.
Экспонента
Экспонента в матрице вычисляется поэлементно, то есть показатель степени каждого элемента вычисляется путем возведения элемента в степень входного скалярного значения.
В приведенном выше фрагменте кода мы выяснили показатель степени каждого элемента входной матрицы, возведя его в степень 2.
Операция умножения с использованием методов NumPy
Для выполнения умножения матрицы NumPy можно использовать следующие методы:
NumPy Tutorial: Простое Руководство На Основе Примеров
Вступление
Библиотека NumPy – это популярная библиотека Python, используемая для научных вычислительных приложений, и является аббревиатурой от “Numerical Python”. Операции Numpy делятся на три основные категории: Преобразование Фурье и Манипулирование формой, Математические и логические операции, а также Линейная алгебра и генерация случайных чисел. Чтобы сделать это как можно быстрее, NumPy написан на C и Python.
В этой статье мы дадим краткое введение в стек NumPy и увидим, как библиотека NumPy может быть использована для выполнения различных математических задач.
Преимущества NumPy
NumPy имеет несколько преимуществ по сравнению с использованием основных математических функций Python, некоторые из которых описаны здесь:
Что касается последнего пункта, взгляните на следующий сценарий:
Вы можете видеть, как легко добавить скалярное значение к каждому элементу в списке с помощью NumPy. Он не только читабелен, но и быстрее по сравнению с предыдущим кодом.
Это только верхушка айсберга, на самом деле библиотека NumPy способна выполнять гораздо более сложные операции в мгновение ока. Давайте рассмотрим некоторые из этих операций.
Операции NumPy
Прежде чем мы сможем выполнить какие-либо операции NumPy, нам нужно установить пакет NumPy. Чтобы установить пакет NumPy, вы можете использовать установщик pip. Для установки выполните следующую команду:
В противном случае, если вы запускаете Python через дистрибутив Anaconda, вы можете выполнить вместо этого следующую команду:
Теперь, когда NumPy установлен, давайте рассмотрим некоторые из наиболее распространенных операций библиотеки.
Создание массива NumPy
Массивы NumPy являются строительными блоками большинства операций NumPy. Массивы NumPy можно разделить на два типа: одномерные массивы и двумерные массивы.
Существует несколько способов создания массива NumPy. В этом разделе мы обсудим некоторые из них.
Метод массива
Если бы вы напечатали массив nums на экране, вы бы увидели, что он отображается следующим образом:
Приведенный выше сценарий приводит к матрице, в которой каждый внутренний список во внешнем списке становится строкой. Количество столбцов равно количеству элементов в каждом внутреннем списке. Выходная матрица будет выглядеть следующим образом:
Метод аранжировки
Достаточно просто, не так ли? Приведенный выше скрипт вернет массив NumPy размера 5 с элементами 2, 3, 4, 5 и 6. Помните, что метод arange возвращает массив, который начинается с начального индекса и заканчивается на один индекс меньше конечного индекса. Вывод этого кода выглядит следующим образом:
Теперь давайте добавим шаг размером 2 к нашему массиву и посмотрим, что произойдет:
Вывод теперь выглядит следующим образом:
Вы можете видеть, что массив начинается с 2, за которым следует размер шага 2 и заканчивается на 6, что на единицу меньше конечного индекса.
Метод нулей
Помимо создания пользовательских массивов с предварительно заполненными данными, вы также можете создавать массивы NumPy с более простым набором данных. Например, вы можете использовать метод zeros для создания массива всех нулей, как показано ниже:
Приведенный выше скрипт вернет двумерный массив из 5 строк и 4 столбцов:
Метод те
Аналогично, вы можете создать одномерные и двумерные массивы всех единиц, используя метод ones следующим образом:
И снова, для двумерного массива, попробуйте следующий код:
Теперь, если вы напечатаете массив ones на экране, вы увидите следующий двумерный массив:
Метод linspace
Выходные данные будут возвращать целые числа от 1 до 10:
Теперь давайте попробуем создать массив с 20 линейно расположенными элементами от 1 до 10. Выполните следующий сценарий:
Это приведет к следующему массиву:
Обратите внимание, что выходные данные могут выглядеть как матрица, но на самом деле это одномерный массив. Из-за проблемы с интервалом элементы были показаны в нескольких строках.
Глазной метод
Результирующая матрица выглядит следующим образом:
Случайный метод
Приведенный выше скрипт возвращает матрицу из 2 строк и 3 столбцов. Матрица содержит равномерное распределение чисел от 0 до 1:
Наконец, для создания массива случайных целых чисел существует метод randint для такого случая. Метод randint принимает нижнюю границу, верхнюю границу и количество возвращаемых целых чисел. Например, если вы хотите создать массив из 5 случайных целых чисел в диапазоне от 50 до 100, вы можете использовать этот метод следующим образом:
В нашем случае выход выглядел так:
Важно отметить, что эти числа генерируются случайным образом каждый раз, когда вы вызываете метод, поэтому вы увидите другие числа, чем в нашем примере.
Мы видели разные способы создания массивов Python. Давайте теперь рассмотрим некоторые другие функции массива.
Изменение формы массива NumPy
Массив nums представляет собой одномерный массив из 16 элементов в диапазоне от 1 до 16:
Nos давайте преобразуем его в двумерный массив из 4 строк и 4 столбцов:
Теперь массив выглядит следующим образом:
Уместно отметить, что вы не можете изменить форму массива, если число элементов в одномерном массиве не равно произведению строк и столбцов измененного массива. Например, если у вас есть 45 элементов в 1-d массиве, вы не можете преобразовать его в матрицу из 5 строк и 10 столбцов, так как матрица 5×10 имеет 50 элементов, а исходная-только 45.
Поиск Максимальных/Минимальных Значений
Наш массив случайных целых чисел выглядит следующим образом:
“1” будет напечатано на выходе.
Аналогично, для получения максимального значения выполните следующий код:
Приведенный выше скрипт вернет “84” в качестве выходного сигнала.
Приведенный выше скрипт выведет “2”, так как 84-это самое большое число в списке, и оно находится на второй позиции массива.
Аналогично, argmin() вернет “4”, потому что 1-это наименьшее число и находится на 4-й позиции.
Индексация массива в NumPy
Чтобы эффективно использовать массивы NumPy, очень важно понять, как они индексируются, о чем я расскажу в следующих нескольких разделах.
Индексация с 1-D массивами
Давайте создадим простой массив из 15 чисел:
Вы можете получить любой элемент, передав номер индекса. Как и списки Python, массивы Numpy имеют нулевую индексацию. Например, чтобы найти элемент во втором индексе (3-я позиция) массива, можно использовать следующий синтаксис:
У нас есть цифра 3 во втором индексе, поэтому она будет напечатана на экране.
Вы также можете распечатать диапазон чисел с помощью индексации. Чтобы получить диапазон, вам нужно передать startindex и один меньше конечного индекса, разделенные двоеточием, внутри квадратных скобок, которые следуют за именем массива. Например, чтобы получить элементы от первого до седьмого индекса, можно использовать следующий синтаксис:
Приведенный выше скрипт выведет целые числа от 2 до 8:
Вы также можете разрезать массив и назначить элементы разрезанного массива новому массиву:
Индексация с помощью 2-D массивов
Индексирование двумерного массива NumPy очень похоже на индексирование матрицы. Давайте сначала создадим двумерный массив NumPy размером 3×3. Для этого выполните следующий код:
А теперь давайте распечатаем:
Как и 1-D массивы, массивы NumPy с двумя измерениями также следуют нулевому индексу, то есть для доступа к элементам в первой строке необходимо указать 0 в качестве индекса строки. Точно так же, чтобы получить доступ к элементам в первом столбце, вам также нужно указать 0 для индекса столбца.
Вы увидите “1” в выходных данных. Аналогично, мы можем получить элемент в третьей строке и третьем столбце следующим образом:
Вы увидите “9” на выходе.
В дополнение к извлечению одного элемента, вы можете извлечь всю строку, передав только индекс строки в квадратные скобки. Например, следующий скрипт возвращает первую строку из массива nums2d :
На выходе просто одномерный массив:
Аналогично, чтобы получить только первый столбец, вы можете использовать следующий синтаксис:
Выход снова является массивом, но это комбинация первых элементов каждого массива двумерного массива:
Наконец, для извлечения элементов из первых двух строк и первых двух столбцов можно использовать следующий синтаксис:
Приведенный выше сценарий возвращает следующие выходные данные:
Арифметические операции с массивами NumPy
Давайте сначала сложим два массива вместе:
Как вы можете видеть, каждая позиция является суммой 2 элементов в этой позиции в исходных массивах.
Если вы добавите массив со скалярным значением, то это значение будет добавлено к каждому элементу в массиве. Давайте добавим 10 к массиву nums и выведем результирующий массив на консоль. Вот как вы это сделаете:
И результирующий массив nums 3 становится:
Вычитание, сложение, умножение и деление могут быть выполнены таким же образом.
Помимо простой арифметики, вы можете выполнять более сложные функции над массивами Numpy, например log, square root, exponential и т. Д.
Функция журнала
Следующий код просто возвращает массив с журналом всех элементов входного массива:
Вывод выглядит следующим образом:
Функция exp
Следующий скрипт возвращает массив с экспонентами всех элементов входного массива:
Функция sqrt
Следующий скрипт возвращает массив с квадратными корнями всех элементов входного массива:
Функция греха
Следующий скрипт возвращает массив с синусом всех элементов входного массива:
Операции линейной алгебры с массивами NumPy
Одним из самых больших преимуществ массивов NumPy является их способность выполнять операции линейной алгебры, такие как векторное точечное произведение и матричное точечное произведение, гораздо быстрее, чем вы можете это сделать со списками Python по умолчанию.
Нахождение векторного точечного произведения
Вычисление векторного точечного произведения для двух векторов может быть вычислено путем умножения соответствующих элементов двух векторов и последующего сложения результатов из произведений.
Давайте создадим два вектора и попробуем найти их точечное произведение вручную. Вектор в NumPy-это в основном просто 1-мерный массив. Выполните следующий скрипт для создания наших векторов:
Давайте найдем точечный продукт без использования библиотеки NumPy. Для этого выполните следующий сценарий:
Теперь давайте посмотрим, как мы можем найти точечный продукт с помощью библиотеки NumPy. Посмотрите на следующий сценарий:
Для очень больших массивов вы также должны заметить улучшение скорости по сравнению с нашей версией только для Python, благодаря использованию NumPy кода C для реализации многих своих основных функций и структур данных.
Матричное умножение
Как и точечное произведение двух векторов, вы также можете умножить две матрицы. В NumPy матрица-это не что иное, как двумерный массив. Чтобы умножить две матрицы, внутренние размеры матриц должны совпадать, а это значит, что число столбцов матрицы слева должно быть равно числу строк матрицы справа от произведения. Например, если матрица X имеет размеры [3,4], а другая матрица Y имеет размеры [4,2], то матрицы X и Y можно умножить вместе. Результирующая матрица будет иметь размеры [3,2], которые являются размерами внешних измерений.
Вы также можете умножить две матрицы по элементам. Для этого размеры двух матриц должны совпадать, как при сложении массивов. Функция multiply используется для поэлементного умножения.
Давайте попробуем умножить матрицы X и Y по элементам:
При выполнении приведенного выше кода возникнет следующая ошибка:
Матрица X была успешно умножена на саму себя, потому что размеры умноженных матриц совпадали.
Нахождение обратной матрицы
Для нашего примера давайте найдем обратную матрицу 2×2. Взгляните на следующий код:
Вывод приведенного выше кода выглядит следующим образом:
Теперь, чтобы проверить, правильно ли вычислено обратное, мы можем взять точечное произведение матрицы с ее обратным, которое должно дать единичную матрицу.
И результат оказался таким, как мы и ожидали. Единицы в диагонали и нули (или очень близкие к нулю) в другом месте.
Нахождение определителя матрицы
Нахождение следа матрицы
Вывод
Библиотека Pythons NumPy – одна из самых популярных библиотек для численных вычислений. В этой статье мы подробно рассмотрели библиотеку NumPy с помощью нескольких примеров. Мы также показали, как выполнять различные операции линейной алгебры с помощью библиотеки NumPy, которые обычно используются во многих приложениях науки о данных.
Я бы посоветовал вам попрактиковаться в примерах, приведенных в этой статье. Если вы планируете начать карьеру специалиста по обработке данных, библиотека NumPy определенно является одним из инструментов, которые вам необходимо освоить, чтобы стать успешным и продуктивным сотрудником в этой области.
