Python:MinMax扩展数组的快速方法

时间:2018-04-12 15:09:20

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

我使用以下方法缩放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]

4 个答案:

答案 0 :(得分:1)

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

from sklearn.preprocessing import minmax_scale

minmax_scale(array)

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

答案 1 :(得分:0)

最简单的代码加速不是两次计算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实际上运行缓慢的数组有多大?

答案 2 :(得分:0)

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

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

Inplace运营商(+=-=等等)不会占用您的内存(因此不太可能在磁盘上进行交换)。当然,这会破坏您的初始x,所以只有在您之后不需要x时才可以......

另外,他建议在高维矩阵中连接多个数据的想法,如果你有很多通道是一个好主意,但同样应该测试这个BIG矩阵是否生成磁盘交换,与处理的小矩阵相比按顺序。

答案 3 :(得分:0)

我认为您仍然可以使用sklearn的MinMaxScaler。您只需要将数据重塑为[n_samples, n_features]之类,对其进行缩放,然后将其重塑为原始形状。只要正确地重塑它就没有关系。在速度方面,我认为这与使用numpy进行操作并没有真正的不同,它只是使您免于倍增和除法的麻烦。