python中向上或向下取整一半的快速方法

python中向上或向下取整一半的快速方法,python,numpy,rounding,Python,Numpy,Rounding,我有一个复数的numpy数组,需要创建一个新的数组,其中实数部分和虚数部分取整,一半取整要么朝向零,要么朝向无穷大 关于stackoverflow,有几条建议使用decimal包,允许指定不同类型的舍入。对于复数数组x,以下代码起作用,但速度非常慢: rounded_array = np.array([ float(Decimal(x.real).quantize(0, rounding=ROUND_HALF_DOWN)) + 1j * \ float(D

我有一个复数的numpy数组,需要创建一个新的数组,其中实数部分和虚数部分取整,一半取整要么朝向零,要么朝向无穷大

关于stackoverflow,有几条建议使用decimal包,允许指定不同类型的舍入。对于复数数组
x
,以下代码起作用,但速度非常慢:

    rounded_array = np.array([
        float(Decimal(x.real).quantize(0, rounding=ROUND_HALF_DOWN)) + 1j * \
        float(Decimal(x.imag).quantize(0, rounding=ROUND_HALF_DOWNs)) for x in arr])
有哪些简单但快速的替代方案? 有人建议采取这种解决办法: 但是,它仅适用于实数组,并且比下面建议的解决方案慢得多。

您可以独立地计算实部和虚部,然后从中创建新数组:

rounded_array = np.fix(arr.real) + 1j*np.fix(arr.imag)

快速就地四舍五入:

arr = arr.view(float)
m = arr % 1. <= .5
arr[m] = np.floor(arr[m])
arr[~m] = np.ceil(arr[~m])
arr = arr.view(complex)

时间安排

x = np.arange(-1000, 1000, .1)
arr = x + 1j * x


@mkrieger1与下面的响应相比,该解决方案似乎非常慢。此外,该解决方案仅适用于实数数组。对于正数和负数,该解决方案似乎不会在一半时舍入到零。我希望rnd(-1.5)=-2和rnd(1.5)=2@rhz请看我的最新答案这确实快得多。从零取整需要如何修改?
arr[m]=np.trunc(arr[m])+1
arr[~m]
保持不变)
x = np.arange(-1000, 1000, .1)
arr = x + 1j * x
%%timeit
rounded_array = np.array([
        float(Decimal(x.real).quantize(0, rounding=ROUND_HALF_DOWN)) + 1j * \
        float(Decimal(x.imag).quantize(0, rounding=ROUND_HALF_DOWN)) for x in arr])
        
1.83 s ± 27.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

%%timeit
arr1 = arr.view(float).copy('K')
m = arr1 % 1. == .5
arr1[m] = np.trunc(arr1[m])
arr1[~m] = np.round(arr1[~m])
arr1 = arr1.view(complex)


1.78 ms ± 18.6 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)