首页 > 解决方案 > 沿第一维的轴按列缩放 3d numpy 数组

问题描述

我有一个表示时间序列数据的 3d numpy 数组,即[样本数、时间步长、特征]。

我想在 -1 和 1 之间缩放每个特征。但是,每个特征都应该相对于数组第一维中所有样本的最大值和最小值进行缩放。例如,我的数组是形状:

multi_data.shape
(66, 5004, 2)

我尝试了以下方法:

data_min = multi_data.min(axis=1, keepdims=True)
data_max = multi_data.max(axis=1, keepdims=True)
multi_data = (2*(multi_data-data_min)/(data_max-data_min))-1

问题是这会独立缩放每个“批次”(我的数组的第一个维度)。我想要做的是通过所有 66 个批次的最大值和最小值来缩放每个特征(我有两个),然后根据这些最大值和最小值来缩放每个特征,但我不太清楚如何为达到这个。任何指针都会非常受欢迎。

标签: pythonpython-3.xnumpymachine-learning

解决方案


如何将其与另一个链接min/max

data_min = multi_data.min(axis=1, keepdims=True).min(axis=0, keepdims=True)
data_max = multi_data.max(axis=1, keepdims=True).max(axis=0, keepdims=True)
multi_data = (2*(multi_data-data_min)/(data_max-data_min))-1

或者:

data_min = multi_data.min(axis=(0,1), keepdims=True)
data_max = multi_data.max(axis=(0,1), keepdims=True)
multi_data = (2*(multi_data-data_min)/(data_max-data_min))-1

由于您使用min/max的是前两个维度,因此您可以忘记keepdims并使用广播,因此在这种情况下可以节省相当多的内存:

data_min = multi_data.min(axis=(0,1))
data_max = multi_data.max(axis=(0,1))
multi_data = (2*(multi_data-data_min)/(data_max-data_min))-1

推荐阅读