我有一个numpy数组(比方说100x64x64)。
我的目标是独立缩放每个64x64层并存储缩放器以供以后使用。
这是使用for循环解决方案的方法:
continue
我的实际数组要大得多,并且要花很多时间才能遍历它。
您是否为此考虑过一些矢量化解决方案,否则for-loop是唯一的方法?
答案 0 :(得分:0)
如果我正确理解MinMaxScaler
的工作原理,它可以在沿axis=0
递减的独立数组上运行。
要使其适用于您的情况,您需要将X
转换为(64 * 64, 100)
数组:
s = X.shape
X = np.moveaxis(X, 0, -1).reshape(-1, s[0])
或者,您可以写
X = X.reshape(s[0], -1).T
现在您可以使用进行缩放
M = MinMaxScaler()
X = M.fit_transform(X)
由于实际拟合是在第一个维度上计算的,因此所有结果的大小将均为100。由于最后一个维度的大小相同,因此将完美广播。
要恢复原始形状,请反转原始变换:
X = X.T.reshape(s)
完成后,M
将是针对100个功能校准的缩放器。这里不需要字典。请记住,以整数序列为关键字的字典可以更好地表示为列表或数组,这就是这种情况。
答案 1 :(得分:0)
IIUC,您可以手动缩放:
mm, MM = inputs.min(axis=(1,2)), inputs.max(axis=(1,2))
# save these for later use
joblib.dump((mm,MM), 'minmax.joblib')
def scale(inputs, mm, MM):
return (inputs - mm[:,None,None])/(MM-mm)[:,None,None]
# load pre-saved min & max
mm, MM = joblib.load('minmax.joblib')
# scaled inputs
scale(inputs, mm, MM)