Python 如何始终在numpy中汇总XX.5

Python 如何始终在numpy中汇总XX.5,python,numpy,rounding,Python,Numpy,Rounding,我读到numpy在取整方面没有偏见,它按照设计的方式工作。“如果你总是将0.5四舍五入到下一个最大的数字,那么一组四舍五入数字的平均值可能会略大于未四舍五入数字的平均值:这种偏差或漂移会对某些数值算法产生非常坏的影响,并使其不准确。” 不管这些信息,假设我总是想凑热闹,我怎么能在numpy做到呢?假设我的数组可以相当大 为简单起见,假设我有一个数组: import numpy as np A = [ [10, 15, 30], [25, 134, 41], [134, 413, 51]] A

我读到numpy在取整方面没有偏见,它按照设计的方式工作。“如果你总是将0.5四舍五入到下一个最大的数字,那么一组四舍五入数字的平均值可能会略大于未四舍五入数字的平均值:这种偏差或漂移会对某些数值算法产生非常坏的影响,并使其不准确。”

不管这些信息,假设我总是想凑热闹,我怎么能在numpy做到呢?假设我的数组可以相当大

为简单起见,假设我有一个数组:

import numpy as np

A = [ [10, 15, 30], [25, 134, 41], [134, 413, 51]]
A = np.array(A, dtype=np.int16)

decimal = A * .1
whole = np.round(decimal)
十进制看起来像:

[[  1.    1.5   3. ]
 [  2.5  13.4   4.1]
 [ 13.4  41.3   5.1]]
[[  1.   2.   3.]
 [  2.  13.   4.]
 [ 13.  41.   5.]]
整体看起来像:

[[  1.    1.5   3. ]
 [  2.5  13.4   4.1]
 [ 13.4  41.3   5.1]]
[[  1.   2.   3.]
 [  2.  13.   4.]
 [ 13.  41.   5.]]
如您所见,1.5四舍五入为2,2.5也四舍五入为2。我怎样才能强迫自己总是得到XX.5的综合答案?我知道我可以在数组中循环并使用python round(),但这肯定会慢得多。我想知道是否有一种使用numpy函数的方法

import numpy as np
A = [ [1.0, 1.5, 3.0], [2.5, 13.4, 4.1], [13.4, 41.3, 5.1]]
A = np.array(A)

print(A)

def rounder(x):
    if (x-int(x) >= 0.5):
        return np.ceil(x)
    else:
        return np.floor(x)

rounder_vec = np.vectorize(rounder)
whole = rounder_vec(A)
print(whole)

或者,您也可以查看,对于其他舍入样式,答案几乎是never
np.vectorize
。您可以而且应该以完全矢量化的方式来完成这项工作。假设对于
x>=0
,您需要
r=floor(x+0.5)
。如果希望负数向零舍入,则相同的公式适用于
x<0
。假设你总是想从零开始四舍五入。在这种情况下,您正在为
x<0
查找
ceil(x-0.5)

要在不调用
np.vectorize
的情况下为整个阵列实现该功能,可以使用掩蔽:

def round_half_up(x):
    mask = (x >= 0)
    out = np.empty_like(x)
    out[mask] = np.floor(x[mask] + 0.5)
    out[~mask] = np.ceil(x[~mask] - 0.5)
    return out
请注意,如果在一个方向上对所有对象进行舍入,则不需要使用遮罩:

def round_up(x):
    return np.floor(x + 0.5)
现在,如果您想让它真正高效,您可以去掉所有的临时数组。这将使用UFUNC的全部功率:

def round_half_up(x):
    out = x.copy()
    mask = (out >= 0)
    np.add(out, 0.5, where=mask, out=out)
    np.floor(out, where=mask, out=out)
    np.invert(mask, out=mask)
    np.subtract(out, 0.5, where=mask, out=out)
    np.ceil(out, where=mask, out=out)
    return out
以及:


np.ceil将始终对其进行汇总。我仍然希望1.3到1,1.5到2。也许这在我的问题中并不清楚,如果是这样的话,那么在numpy中就没有这个功能了。您可以做的是循环遍历每个元素并检查向上取整或向下取整您真的不应该在numpy中循环。您的答案要求调用方在调用您的函数之前设置一个临时取整器。这不是请求-请求将是输入到输出的直接调用您希望负数有什么行为?这是一个好问题,虽然在我的场景中没有负数,所以我没有真正想到它