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

时间:2018-01-14 16:43:33

标签: python scipy linear-algebra

我正在探索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。但是,使用get_blas_funcs()输入numpy float32或numpy64就可以了,并且在输出时不会更改dtype。

这里发生了什么? 该函数如何处理数据类型?

1 个答案:

答案 0 :(得分:0)

一些一般性意见:

  • BLAS更像是一个规范而不是一个库
    • 有很多实现(Atlas,OpenBLAS,MKL),或多或少都在同一个界面上工作
  • BLAS完全是关于浮点数学
    • 可用前缀决定使用的类型(see top left
    • S:单精度,D:双精度,C复数单精度和Z复数双精度
      • (支持sometimes混合类型,如:CS,ZD)
        • 例如,函数scasum使用复杂的输入数组并返回实际值。(上面的链接)
    • 一般情况下,不支持整数类型!
      • 似乎有一些想法可以支持这些(链接:12),但肯定不常见(也许还没有强大/经过良好测试的支持)
      • 我非常确定在任何大型库(numpy,scipy,sklearn,pandas)中都没有单一的整数式BLAS用法,如果没有所有可能的BLAS支持的标准,这当然会很难 - 后端(正如我所说:多个候选人!)
  • 这意味着:你要求的功能是不可用的(带有整数类型的scal)
    • 这意味着:需要进行施法!
    • 做了什么样的演员,是一个设计决定
      • 这里似乎(如果需要,可能很容易检查代码):
        • 如果键入其中一个受支持的,请保留
          • float32 - > float32(S - > S)
          • float64 - >浮动64(D - > D)
        • 如果不是:强制转换为双精度/ D(或多或少默认为numpy / scipy !;比单精度更常见;至少现在如此!)
  • 使用BLAS是非常低级的,每个人都想要做到这一点需要确保理解正确的做法(不仅是类型;还有内存布局)!
    • scipy's warning比较:警告 这些函数几乎没有错误检查。通过误用它们可能导致崩溃,所以更喜欢使用scipy.linalg中的更高级例程。
  • 此处有一些相关问题(显示这些缺失功能的含义):Why is it faster to perform float by float matrix multiplication compared to int by int?