【问题标题】:Python: Fast way of MinMax scaling an arrayPython:MinMax 缩放数组的快速方法
【发布时间】:2018-09-22 19:30:37
【问题描述】:

我使用下面的方法在 0 到 1 之间缩放一个 n 维数组:

x_scaled = (x-np.amin(x))/(np.amax(x)-np.amin(x))

但是对于大型数据集来说它非常慢。我有数千个相对较大的数组需要处理。在 python 中有没有更快的方法?

编辑:我的数组处于形状 (24,24,24,9)。对于 scikit 中的 MinMax 缩放器,输入数组必须具有某种形状,而我没有,所以我不能使用它。在文档中它说:

Parameters: 
X : array-like, shape [n_samples, n_features]

【问题讨论】:

标签: python numpy machine-learning scikit-learn data-analysis


【解决方案1】:

使用ptp 是有风险的,即max - min,因为理论上可以为0,导致异常。使用minmax_scale 更安全,因为它没有这个问题。首先,pip install scikit-learn

from sklearn.preprocessing import minmax_scale

minmax_scale(array)

如果使用 sklearn 管道,请改用 MinMaxScaler

【讨论】:

    【解决方案2】:

    MadPhysicist 的回答可以优化以避免不必要的临时数据分配:

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

    就地操作符(+=-= 等...)不会占用您的内存(因此磁盘交换不太可能发生)。当然,这会破坏您最初的x,因此只有在您之后不需要x 时才可以...

    此外,他提出的在高维矩阵中连接多数据的想法,如果您有很多通道,这是一个好主意,但与处理的小矩阵相比,应该再次测试这个 BIG 矩阵是否会产生磁盘交换按顺序排列。

    【讨论】:

    • @MaxU:对于这种使用完整广播的特定情况,您是正确的。但是使用就地运算符通常是救命稻草;-)
    • 这个答案很危险因为ptp()理论上可以返回0。
    • @A-B-B。与手动计算差异相同。问题是关于如何加速代码,而不是抓住所有的极端情况。话虽如此,您的评论非常有用。
    【解决方案3】:

    最简单的代码加速不是计算x.min 两次。这本身应该会帮助大约 30%:

    mn, mx = x.min(), x.max()
    x_scaled = (x - mn) / (mx - mn)
    

    您还可以从x.ptp 获得一些里程:

    mn, ptp = x.min(), x.ptp()
    x_scaled = (x - mn) / ptp
    

    就此而言,minmax 实际运行缓慢的数组有多大?

    【讨论】:

    • 谢谢,我的问题是我想用 minmax 缩放大量的数组,所以它不是一个大数组,而是很多个比较大的数组。
    • @Wise。然后连接它们并沿特定轴应用函数。请让您的问题清晰完整。
    • 这个答案很危险因为ptp()理论上可以返回0。
    【解决方案4】:

    我想你仍然可以使用 sklearn 的MinMaxScaler。您只需要将数据重塑为[n_samples, n_features] 之类的东西,对其进行缩放,然后将其重塑回原始形状。只要你正确地重塑它并不重要。就速度而言,我认为它与使用 numpy 执行它并没有什么不同,它只是让你免于乘除的麻烦。

    【讨论】:

      猜你喜欢
      • 2013-09-16
      • 2012-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-12
      • 2016-02-13
      • 2019-01-20
      • 1970-01-01
      相关资源
      最近更新 更多