规范化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 不同@)。这些都不是熊猫DataFrame
s..
我不认为这是一个完整的规范化。我会查看***.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数组列的主要内容,如果未能解决你的问题,请参考以下文章