规范化/翻译 ndarray - Numpy / Python
Posted
技术标签:
【中文标题】规范化/翻译 ndarray - Numpy / Python【英文标题】:Normalize / Translate ndarray - Numpy / Python 【发布时间】:2014-04-22 22:54:11 【问题描述】:有一种简单的方法可以标准化一个 ndarray(每个值都在 0.0, 1.0 之间)?
例如,我有一个像这样的矩阵:
a = [[1., 2., 3.],
[4., 5., 6.],
[7., 8., 9.]]
到目前为止,我正在获得最大值
max(max(p[1:]) for p in a)
a / p
除了我认为 numpy 可能在一行中有一个方法,如果我的数据是这样的,这不起作用:
b = [[-1., -2., -3.],
[-4., -5., -6.],
[-7., -8., 0.]]
这给出了由零除法引起的错误。
我想要做的是最大值变为 1。所以,我想做一个转换,使 9 变为 1(在正的情况下,只需将值除以最大值)和 0(当它是最大值)变为 1(使用翻译方法,例如),我知道这样做很热,但我猜 numpy 可能在其包中有解决方案。
如何使用 numpy 很好地执行此操作?
提前谢谢你。
【问题讨论】:
如果最大值为 0,你将如何规范化数组?该错误不是因为您的操作方式,而是您定义问题的方式中的域错误。 我想要做的是最大值变为 1,最小值变为 0。所以,我想做一个翻译,使 0 变为 1,我知道这样做很热,但是我猜 numpy 可能在它的包里有一个解决方案。 好的,所以你想按最大幅度(即绝对值)进行归一化。 最小零没有意义,抱歉。 @sh1ftst0rm -- 不完全是。在一般情况下,按最大幅度标准化会将值置于 -1、1 的范围内。峰峰值需要进行偏移和归一化。 【参考方案1】:在一般情况下,您可以将np.ptp
1(峰到峰)与np.min
结合使用:
new_arr = (a - a.min())/np.ptp(a)
示例:
>>> a = np.array([[-1., 0, 1], [0, 2, 1]])
>>> np.ptp(a)
3.0
>>> a
array([[-1., 0., 1.],
[ 0., 2., 1.]])
>>> (a - a.min())/np.ptp(a)
array([[ 0. , 0.33333333, 0.66666667],
[ 0.33333333, 1. , 0.66666667]])
当然,如果a
完全由零组成,这仍然会产生错误——但在这种情况下问题不是很好。
1IIRC,np.ptp
调用 np.max
和 np.min
。如果性能真的很关键,您可以创建自己的ptp
并将np.min
保存到临时变量中,这样您就不会计算两次。
【讨论】:
注意,最大值为0时OP有问题;在这种情况下,我认为这没有帮助。 @CodyPiersall -- 是的,我意识到了这一点。已解决。以上是关于规范化/翻译 ndarray - Numpy / Python的主要内容,如果未能解决你的问题,请参考以下文章