【问题标题】:How do data types work with scipy.linalg.get_blas_functions?数据类型如何与 scipy.linalg.get_blas_functions 一起使用?
【发布时间】:2018-01-14 16:43:33
【问题描述】:

我正在探索 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。

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

【问题讨论】:

    标签: python scipy linear-algebra


    【解决方案1】:

    一些通用的cmets:

    • 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?

    【讨论】:

    • 谢谢,很好的回答。我之前没有做过“投射”,您介意提供一些有用的教育页面链接吗?
    • 啊,强制转换只是不同数据类型之间的移动。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    相关资源
    最近更新 更多