【发布时间】:2020-08-13 13:44:42
【问题描述】:
我正在寻找 NumPy 中从 int16 到 float32 的最快和最节省内存的转换例程。我的用例是音频样本的转换,因此真实世界的数组很容易在 100K-1M 元素范围内。
我想出了两种方法。 第一种:将int16转换为float32,然后就地除法。这将需要至少两次遍历内存。
第二种:直接使用divide,指定一个在float32中的out-array。从理论上讲,这应该只通过一次内存,因此会更快一些。
我的问题:
- 第二种方式是直接用float32除法吗? (我希望它不使用 float64 作为中间 dtype)
- 一般来说,有没有办法在指定的 dtype 中进行除法?
- 我需要指定一些
casting参数吗? - 关于从 [-1.0, 1.0] float32 转换回 int16 的相同问题
谢谢!
import numpy
a = numpy.array([1,2,3], dtype = 'int16')
# first
b = a.astype(numpy.float32)
c = numpy.divide(b, numpy.float32(32767.0), out = b)
# second
d = numpy.divide(a, numpy.float32(32767.0), dtype = 'float32')
print(c, d)
【问题讨论】:
-
您不必将整个数组相除,也可以将其乘以 (1/32767),这样会快一点。我还用 numba 进行了尝试(单线程与 numpy 大致相同,多线程版本对于不太小的数组 (1_000_000) 元素和 np.copy(a) 一样快,速度快 60%
标签: performance numpy casting