数据类型如何与 scipy.linalg.get_blas_functions 一起使用?
How do data types work with 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。但是,使用 get_blas_funcs() 输入 numpy float32 或 numpy64 没问题,并且在输出时不会更改数据类型。
这里发生了什么?
此函数如何处理数据类型?
一些一般性评论:
- BLAS 与其说是一个库,不如说是一个规范
- 有很多实现(Atlas、OpenBLAS、MKL),或多或少都在同一个接口上工作
- BLAS 完全是关于浮点数学的
- 可用前缀决定使用的类型 (see top left)
- 有S:单精度,D:双精度,C复数单精度和Z复数双精度
- (sometimes 支持混合类型,如:CS、ZD)
- 例如,函数 scasum 使用复数输入数组和 returns 实数值。(link 以上)
- 一般不支持整数类型!
- 这意味着:您正在请求一个不可用的函数(具有类似整数类型的标度)
- 这意味着:需要进行转换!
- 做什么样的铸造,是设计决策:
- 这里似乎(如果需要的话可能很容易检查代码):
- 如果输入受支持的一种,请保留它
- float32 -> float32 (S -> S)
- float64 -> 浮点数 64 (D -> D)
- 如果不是:转换为双精度/D(在 numpy/scipy 中或多或少是默认值!;比单精度更常见;至少现在是这样!)
- 使用 BLAS 是非常低级的,每个尝试这样做的人都需要确保了解正确执行所需的条件(不仅是类型;还有内存布局)!
- 与scipy's warning比较:警告
这些函数几乎不做错误检查。误用它们可能会导致崩溃,因此最好使用 scipy.linalg.
中的高级例程
- 这里有一些相关的问题(显示这些缺失功能的含义):
我正在探索 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 没问题,并且在输出时不会更改数据类型。
这里发生了什么? 此函数如何处理数据类型?
一些一般性评论:
- BLAS 与其说是一个库,不如说是一个规范
- 有很多实现(Atlas、OpenBLAS、MKL),或多或少都在同一个接口上工作
- BLAS 完全是关于浮点数学的
- 可用前缀决定使用的类型 (see top left)
- 有S:单精度,D:双精度,C复数单精度和Z复数双精度
- (sometimes 支持混合类型,如:CS、ZD)
- 例如,函数 scasum 使用复数输入数组和 returns 实数值。(link 以上)
- (sometimes 支持混合类型,如:CS、ZD)
- 一般不支持整数类型!
- 这意味着:您正在请求一个不可用的函数(具有类似整数类型的标度)
- 这意味着:需要进行转换!
- 做什么样的铸造,是设计决策:
- 这里似乎(如果需要的话可能很容易检查代码):
- 如果输入受支持的一种,请保留它
- float32 -> float32 (S -> S)
- float64 -> 浮点数 64 (D -> D)
- 如果不是:转换为双精度/D(在 numpy/scipy 中或多或少是默认值!;比单精度更常见;至少现在是这样!)
- 如果输入受支持的一种,请保留它
- 这里似乎(如果需要的话可能很容易检查代码):
- 使用 BLAS 是非常低级的,每个尝试这样做的人都需要确保了解正确执行所需的条件(不仅是类型;还有内存布局)!
- 与scipy's warning比较:警告 这些函数几乎不做错误检查。误用它们可能会导致崩溃,因此最好使用 scipy.linalg. 中的高级例程
- 这里有一些相关的问题(显示这些缺失功能的含义):