get_lapack_funcs#
- scipy.linalg.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))