规范化/翻译 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.ptp1(峰到峰)与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.maxnp.min。如果性能真的很关键,您可以创建自己的ptp 并将np.min 保存到临时变量中,这样您就不会计算两次。

【讨论】:

注意,最大值为0时OP有问题;在这种情况下,我认为这没有帮助。 @CodyPiersall -- 是的,我意识到了这一点。已解决。

以上是关于规范化/翻译 ndarray - Numpy / Python的主要内容,如果未能解决你的问题,请参考以下文章

Python语音合成(日文翻译)

numpy入门

一文读懂PyTorch张量基础(附代码)

TypeError: 不支持的操作数类型 -: 'numpy.ndarray' 和 'numpy.ndarray'

numpy基础——ndarray对象

Numpy - ndarray 结构