规范化python中的numpy数组列

Posted

技术标签:

【中文标题】规范化python中的numpy数组列【英文标题】:Normalize numpy array columns in python 【发布时间】:2015-06-22 02:00:35 【问题描述】:

我有一个 numpy 数组,其中特定行的每个单元格代表一个特征的值。我将它们全部存储在一个 100*4 的矩阵中。

A     B   C
1000  10  0.5
765   5   0.35
800   7   0.09  

知道如何规范这个 numpy.array 的行,其中每个值都在 0 和 1 之间?

我想要的输出是:

A     B    C
1     1    1
0.765 0.5  0.7
0.8   0.7  0.18(which is 0.09/0.5)

提前致谢:)

【问题讨论】:

澄清一下:它是 NumPy 数组还是 Pandas DataFrame? 在编程时,具体化很重要:set 是 Python 中的一个特定对象,您不能拥有一组 numpy 数组。 Python 没有矩阵,但 numpy 有,并且 matrix 类型与 numpy array/ndarray 不同(它本身与 Python 的 array 类型不同,后者与 @987654328 不同@)。这些都不是熊猫DataFrames.. 我不认为这是一个完整的规范化。我会查看***.com/questions/9775765/… 以获得更好的规范化定义。 【参考方案1】:

如果我理解正确,您要做的就是除以每列中的最大值。您可以使用broadcasting 轻松完成此操作。

从您的示例数组开始:

import numpy as np

x = np.array([[1000,  10,   0.5],
              [ 765,   5,  0.35],
              [ 800,   7,  0.09]])

x_normed = x / x.max(axis=0)

print(x_normed)
# [[ 1.     1.     1.   ]
#  [ 0.765  0.5    0.7  ]
#  [ 0.8    0.7    0.18 ]]

x.max(0) 在第 0 维(即行)上取最大值。这为您提供了一个大小为(ncols,) 的向量,其中包含每列中的最大值。然后,您可以将 x 除以该向量,以标准化您的值,以便将每列中的最大值缩放为 1。


如果x 包含负值,您需要先减去最小值:

x_normed = (x - x.min(0)) / x.ptp(0)

这里,x.ptp(0) 返回沿轴 0 的“峰到峰”(即范围,最大值 - 最小值)。这种标准化还保证每列中的最小值为 0。

【讨论】:

非常感谢您的回答,我在处理“轴”时总是遇到问题! 对于缩减(即.max().min().sum().mean() 等),您只需要记住axis 指定要“折叠”的维度减持期间。如果您想要每列的最大值,则需要折叠行维度。 @rawbeans 查看我的更新。我除以最大值的原因是因为这就是 OP 在他们的示例中显示的内容。 @ali_m,你能解释一下你为什么说“如果 x 包含负值”吗?如果数组的最小值为 100,最大值为 103,我认为您绝对应该使用第二个公式,否则您的结果将不会有 0 偏移。 @GalacticKetchup 您可以通过将 keepdims=True 传递给缩减 ufunc 轻松地将其扩展到任意轴上的缩减。此 arg 可防止缩减轴被“挤出”,以便广播仍能正常工作,例如x / x.max(axis=1, keepdims=True).【参考方案2】:

您可以使用 sklearn.preprocessing:

from sklearn.preprocessing import normalize
data = np.array([
    [1000, 10, 0.5],
    [765, 5, 0.35],
    [800, 7, 0.09], ])
data = normalize(data, axis=0, norm='max')
print(data)
>>[[ 1.     1.     1.   ]
[ 0.765  0.5    0.7  ]
[ 0.8    0.7    0.18 ]]

【讨论】:

有什么方法可以在1 和``2` 之间缩放列值?使用 MinMaxScaler?

以上是关于规范化python中的numpy数组列的主要内容,如果未能解决你的问题,请参考以下文章

将 NumPy 数组转换为带有列的 Pandas 数据框

将 NumPy 数组转换为带有列的 Pandas 数据框

如何规范化 4D numpy 数组?

规范化/翻译 ndarray - Numpy / Python

规范化 ClickHouse 中的列

Numpy 规范化代码异常缓慢