将Numpy数组缩放到特定范围

时间:2016-03-15 00:53:23

标签: python arrays numpy

this question类似,我希望将Numpy数组放入某个范围,但与链接问题不同,我不想将其标准化。我怎样才能有效地做到这一点? Numpy中有内置方法吗?

通过一个例子来澄清,my_scale是我正在寻找的函数,out_range定义了输出范围:

res = my_scale(np.array([-3, -2, -1], dtype=np.float), out_range)
assert res == [-1, 0, 1]
assert res != [-1, -2/3, -1/3]

2 个答案:

答案 0 :(得分:8)

asking on CodeReview之后,我被告知有一个内置的np.interp可以完成此任务:

np.interp(a, (a.min(), a.max()), (-1, +1))

为了后代,我在下面留下了我的旧答案。

我根据this answer中的D3.js代码创建了自己的函数:

import numpy as np

def d3_scale(dat, out_range=(-1, 1)):
    domain = [np.min(dat, axis=0), np.max(dat, axis=0)]

    def interp(x):
        return out_range[0] * (1.0 - x) + out_range[1] * x

    def uninterp(x):
        b = 0
        if (domain[1] - domain[0]) != 0:
            b = domain[1] - domain[0]
        else:
            b =  1.0 / domain[1]
        return (x - domain[0]) / b

    return interp(uninterp(dat))

print(d3_scale(np.array([-2, 0, 2], dtype=np.float)))
print(d3_scale(np.array([-3, -2, -1], dtype=np.float)))

答案 1 :(得分:0)

这样可以解决问题:

def rescale_linear(array, new_min, new_max):
    """Rescale an arrary linearly."""
    minimum, maximum = np.min(array), np.max(array)
    m = (new_max - new_min) / (maximum - minimum)
    b = new_min - m * minimum
    return m * array + b

请注意,存在(无限)许多其他非线性方式来重新调整数组以适应新范围,根据具体情况,这种选择很重要。