scipy.linalg.lapack.

get_lapack_funcs#

scipy.linalg.lapack.get_lapack_funcs(names, массивы=(), dtype=None, ilp64=False)[источник]#

Возвращает доступные объекты функций LAPACK по именам.

Массивы используются для определения оптимального префикса процедур LAPACK.

Параметры:
namesstr или последовательность str

Имя(имена) функций LAPACK без префикса типа.

массивыпоследовательность ndarray, опционально

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

dtypestr или dtype, опционально

Спецификатор типа данных. Не используется, если массивы не пуст.

ilp64{True, False, 'preferred'}, опционально

Возвращать ли вариант процедуры ILP64. Выбор 'preferred' возвращает процедуру ILP64, если она доступна, иначе 32-битную процедуру. По умолчанию: False

Возвращает:
funcslist

Список, содержащий найденную функцию(и).

Примечания

Эта процедура автоматически выбирает между интерфейсами Fortran/C. Код Fortran используется, когда это возможно, для массивов с порядком хранения по столбцам. Во всех остальных случаях предпочтительнее код C.

В LAPACK соглашение об именовании заключается в том, что все функции начинаются с префикса типа, который зависит от типа основной матрицы. Это может быть один из {‘s’, ‘d’, ‘c’, ‘z’} для типов NumPy {float32, float64, complex64, complex128} соответственно, и хранится в атрибуте typecode возвращаемых функций.

Примеры

Предположим, мы хотим использовать подпрограмму ‘?lange’, которая вычисляет выбранную норму массива. Мы передаём наш массив, чтобы получить правильный вариант ‘lange’.

>>> import numpy as np
>>> import scipy.linalg as LA
>>> rng = np.random.default_rng()
>>> a = rng.random((3,2))
>>> x_lange = LA.get_lapack_funcs('lange', (a,))
>>> x_lange.typecode
'd'
>>> x_lange = LA.get_lapack_funcs('lange',(a*1j,))
>>> x_lange.typecode
'z'

Некоторые подпрограммы LAPACK работают лучше всего, когда их внутренний массив WORK имеет оптимальный размер (достаточно большой для быстрых вычислений и достаточно малый, чтобы избежать потерь памяти). Этот размер также определяется специальным запросом к функции, которая часто оборачивается как отдельная функция и обычно обозначается как ###_lwork. Ниже приведён пример для ?sysv

>>> a = rng.random((1000, 1000))
>>> b = rng.random((1000, 1)) * 1j
>>> # We pick up zsysv and zsysv_lwork due to b array
... xsysv, xlwork = LA.get_lapack_funcs(('sysv', 'sysv_lwork'), (a, b))
>>> opt_lwork, _ = xlwork(a.shape[0])  # returns a complex for 'z' prefix
>>> udut, ipiv, x, info = xsysv(a, b, lwork=int(opt_lwork.real))