numpy数组的矢量化“按层”缩放

时间:2019-12-11 07:38:53

标签: python python-3.x numpy scikit-learn

我有一个numpy数组(比方说100x64x64)。

我的目标是独立缩放每个64x64层并存储缩放器以供以后使用。

这是使用for循环解决方案的方法:

continue

我的实际数组要大得多,并且要花很多时间才能遍历它。

您是否为此考虑过一些矢量化解决方案,否则for-loop是唯一的方法?

2 个答案:

答案 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)