numpy阵列的矢量化“bylayer”缩放

2024-06-30 08:20:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个numpy数组(比如100x64x64)

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

这是如何通过for-loop解决方案实现的:

scalers_dict={}    
for i in range(X.shape[0]):
            scalers_dict[i] = MinMaxScaler()
            #fitting the scaler
            X[i, :, :] = scalers_dict[i].fit_transform(X[i, :, :])
#saving dict of scalers
joblib.dump(value=scalers_dict,filename="dict_of_scalers.scaler")

我的真实数组要大得多,遍历它需要相当长的时间

你有没有想过一些更矢量化的解决方案,或者for-loop是唯一的方法


Tags: ofinnumpyloop目标forrange数组
2条回答

如果我正确理解了^{}的工作原理,那么它可以在独立的数组上运行,这些数组沿着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个特性校准的定标器。这里不需要词典。请记住,由整数序列键控的字典可以更好地表示为列表或数组,这里就是这样

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)

相关问题 更多 >