数据类型如何使用scipy.linalg.get_blas_functions?



我正在探索python中的scipy.linalg.get_blas_function()方法。但我注意到它在处理 numpy int 类型时遇到了一些困难。

输入

import scipy.linalg
import numpy as np
def blas(name, ndarray):
arr = scipy.linalg.get_blas_funcs((name,), (ndarray,), dtype=ndarray.dtype)[0]
return arr
blas_scal = blas('scal', np.array([], dtype=np.int32))
print "int32 --> %s" % (blas_scal.dtype)
blas_scal = blas('scal', np.array([], dtype=np.int64))
print "int64 --> %s" % (blas_scal.dtype)
blas_scal = blas('scal', np.array([], dtype=np.float32))
print "float32 --> %s" % (blas_scal.dtype)
blas_scal = blas('scal', np.array([], dtype=np.float64))
print "float64 --> %s" % (blas_scal.dtype)

输出

int32 --> float64
int64 --> float64
float32 --> float32
float64 --> float64

如您所见,当数据类型为整数时,get_blas_funcs() 似乎会忽略该数据类型,并在您拥有任何类型的 numpy 整数时输出 float64。但是,输入 numpy float32 或 numpy64 对于 get_blas_funcs() 是可以的,并且在输出时不会更改 dtype。

这是怎么回事? 此函数如何处理数据类型?

一些一般性评论:

  • BLAS 与其说是一个库,不如说是一个规范
    • 有许多实现(Atlas,OpenBLAS,MKL),它们或多或少都在同一接口上工作。
  • BLAS 是关于浮点数学的
    • 可用的前缀决定了正在使用的类型(见左上角)
    • 有S:单精度,D:双精度,
    • C复单精度和Z复双精度
      • (有时支持混合类型,如:CS,ZD)
        • 例如,函数 scasum 使用复杂的输入数组并返回一个实值。(上面的链接)
    • 通常不支持整数类型!
      • 似乎有一些想法来支持这些(链接:1,2),但它肯定不常见(也许还没有强大/经过充分测试的支持)
      • 我很确定在任何那些大型库(numpy、scipy、sklearn、pandas)中都没有单一的整数类 BLAS 用法,如果没有所有可能的 BLAS 后端支持的标准,这当然会很困难(正如我所说:多个候选者!
  • 这意味着:您正在请求一个不可用的函数(具有类似整数类型的缩放)
    • 这意味着:铸造需要完成!
    • 做什么样的铸造,是一个设计决策
      • 这里似乎(如果需要,可能很容易检查代码):
        • 如果键入受支持的之一,请保留它
          • 浮点数32 ->浮点数32 (S -> S)
          • 浮点数64 ->浮点数 64 (D -> D)
        • 如果不是:转换为双精度/D(在numpy/scipy中或多或少是默认值!;比单精度更常见;至少现在是这样!)
  • 使用 BLAS 是非常低级的,每个尝试这样做的人都需要确保了解正确执行它需要什么(不仅是类型;还有内存布局)!
    • 与 scipy 的警告比较:警告 这些函数几乎不执行错误检查。误用它们可能会导致崩溃,因此更喜欢使用 scipy.linalg 中的更高级别例程。
  • 这里有一些相关的问题(显示这些缺失特征的含义):为什么执行浮点数矩阵乘法比 int 乘以 int 更快?

相关内容

  • 没有找到相关文章

最新更新