【问题标题】:Scale a 3d numpy array column wise along axis of first dimension沿第一维的轴按列缩放 3d numpy 数组
【发布时间】:2020-11-10 05:42:15
【问题描述】:

我有一个表示时间序列数据的 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 个批次的最大值和最小值来缩放每个特征(我有两个),然后根据这些最大值和最小值来缩放每个特征,但我不太清楚如何为了达成这个。任何指针都会非常受欢迎。

【问题讨论】:

    标签: python python-3.x numpy machine-learning


    【解决方案1】:

    如何将其与另一个 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
    

    【讨论】:

    • 哇。这真太了不起了。非常感谢你这么简洁彻底的回答,我不知道我可以像这样放弃keepdims!
    猜你喜欢
    • 1970-01-01
    • 2014-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-12
    • 1970-01-01
    • 2019-04-12
    • 2018-09-01
    相关资源
    最近更新 更多