NumPy数组如何限制在0和1之间?

6

基本上,我有一个可能在任意两个数字之间变化的数组,我想在将其限制为[0,1]空间的同时保留其分布。实现这一目标的函数非常简单。通常我会写成:

def to01(array):
    array -= array.min()
    array /= array.max()
    return array

当然,它可以并且应该更加复杂,以涵盖许多情况,例如所有值都相同(除以零)和浮点数与整数除法(使用np.subtract和np.divide而不是运算符)。但这是最基本的。

问题是我在项目中经常需要进行这种操作,并且它似乎是一个相当标准的数学运算。NumPy中是否有内置函数可以执行此操作?


我有点困惑,因为如果你将一个介于0和1之间的整数数组进行归一化,你最终只会得到一个由零和一组成的数组。这意味着你将失去很多分布信息。 - BKay
1
@user3557216 这看起来非常高效,但我会更改 array 的名称以避免遮蔽 np.array() 函数... - Saullo G. P. Castro
1
@BKay,这个数组会把整数转换成浮点数。通常我一开始就发送浮点数,但这是增强函数另外处理的事情。 - user3557216
1
@Saullo Castro,我从不使用星号导入,这样可以给我更多的自由。 - user3557216
2
可能是如何规范化数组numpy?的重复问题。 - fredtantini
显示剩余5条评论
1个回答

2

不知道是否有内置函数可以完成这个任务(可能没有,因为它本身并不是很难实现)。您可以使用 vectorize 将函数应用于数组的所有元素:

def to01(array):
    a = array.min()
    # ignore the Runtime Warning
    with numpy.errstate(divide='ignore'):
        b = 1. /(array.max() - array.min())
    if not(numpy.isfinite(b)):
        b = 0
    return numpy.vectorize(lambda x: b * (x - a))(array)

是的,我有一个函数可以做到这一点。它有点小众,也许更应该由颜色映射器而不是数据收集器来负责,所以我想这样做就可以了。 - user3557216

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接