将数组舍入到另一个数组中给出的值

Kie*_*unt 3 python arrays numpy rounding

说我有一个数组:

values = np.array([1.1,2.2,3.3,4.4,2.1,8.4])
Run Code Online (Sandbox Code Playgroud)

我想将这些值舍入到任意数组的成员,比如说:

rounds = np.array([1.,3.5,5.1,6.7,9.2])
Run Code Online (Sandbox Code Playgroud)

理想情况下返回一个圆形数字数组和一个残差数组:

rounded = np.array([1.,1.,3.5,5.1,1.,9.2])
residues = np.array([-0.1,-1.2,0.2,0.7,-1.1,0.6])
Run Code Online (Sandbox Code Playgroud)

有这样一个好的pythonic方式吗?

Ale*_*ley 6

一种选择是这样的:

>>> x = np.subtract.outer(values, rounds)
>>> y = np.argmin(abs(x), axis=1)
Run Code Online (Sandbox Code Playgroud)

然后,roundedresidues分别是:

>>> rounds[y]
array([ 1. ,  1. ,  3.5,  5.1,  1. ,  9.2])

>>> rounds[y] - values
array([-0.1, -1.2,  0.2,  0.7, -1.1,  0.8])
Run Code Online (Sandbox Code Playgroud)

本质上x是每个值的二维数组values减去每个值rounds.y是每行最小绝对值索引的一维数组x.这y随后被用于索引rounds.

我应该通过注意如果len(values) * len(rounds)它很大(例如开始超过10e8)来回答这个问题,那么内存使用可能会开始变得令人担忧.在这种情况下,您可以考虑y迭代地构建,以避免必须分配大块内存x.