我使用以下方法缩放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]
答案 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
就此而言,min
或max
实际上运行缓慢的数组有多大?
答案 2 :(得分:0)
可以优化MadPhysicist的答案,以避免不必要的临时数据分配:
x -= x.min()
x /= x.ptp()
Inplace运营商(+=
,-=
等等)不会占用您的内存(因此不太可能在磁盘上进行交换)。当然,这会破坏您的初始x
,所以只有在您之后不需要x
时才可以......
另外,他建议在高维矩阵中连接多个数据的想法,如果你有很多通道是一个好主意,但同样应该测试这个BIG矩阵是否生成磁盘交换,与处理的小矩阵相比按顺序。
答案 3 :(得分:0)
我认为您仍然可以使用sklearn的MinMaxScaler
。您只需要将数据重塑为[n_samples, n_features]
之类,对其进行缩放,然后将其重塑为原始形状。只要正确地重塑它就没有关系。在速度方面,我认为这与使用numpy进行操作并没有真正的不同,它只是使您免于倍增和除法的麻烦。