scipy.linalg.

get_lapack_funcs#

scipy.linalg.get_lapack_funcs(names, arrays=(), dtype=None, ilp64=False)[source]#

从名称返回可用的 LAPACK 函数对象。

数组用于确定 LAPACK 例程的最佳前缀。

参数
namesstr 或 str 序列

不带类型前缀的 LAPACK 函数名称。

arraysndarray 序列,可选

可以提供数组以确定 LAPACK 例程的最佳前缀。如果未提供,将使用双精度例程;否则,将使用数组中最通用的类型。

dtypestr 或 dtype,可选

数据类型指定符。如果 arrays 非空则不使用。

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))