我试图实现我发现fast inverse square root的here的通用版本,这是我到目前为止所提出的:
import numpy as np
def get_K(exponent, B=127, L=2**23, sigma=0.0450465, f=np.float32):
return f((1 - exponent) * L * (B - f(sigma)))
def get_result(exponent, B=127, L=2**23, sigma=0.0450465, f=np.float32):
K = f(get_K(exponent, 127, 2**23, f(0.0450465)))
return lambda num: (K + f(num*exponent))
if __name__ == '__main__':
print((get_result(0.5)(2)).astype(np.int32))
但是当我运行上面的示例时,我得到了532487680
,这与我在numpy.float32
的{{1}}表示中得到的结果相同。
我做错了什么?换句话说,我如何使用numpy将数字从32位浮点数处理为32位整数,与使用numpy时的方式相同?
答案 0 :(得分:2)
以下快速反平方根实现可以与numpy一起使用(改编自[1]),
def fast_inv_sqrt(x):
x = x.astype('float32')
x2 = x * 0.5;
y = x.view(dtype='int32')
y = 0x5f3759df - np.right_shift(y, 1)
y = y.view(dtype='float32')
y = y * ( 1.5 - ( x2 * y * y ) )
return y
现在因为numpy将分配一些临时数组,这不是很快,
import numpy as np
x = np.array(1,10000, dtype='float32')
%timeit fast_inv_sqrt(x)
# 10000 loops, best of 3: 36.2 µs per loop
%timeit 1./np.sqrt(x)
# 10000 loops, best of 3: 13.1 µs per loop
如果你需要速度,你应该在C中执行这个计算,并使用Cython,f2py等编写一个python接口。