沿着第一维的轴逐列对3D numpy数组进行缩放

3

我有一个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个批次的最大和最小值来缩放每个特征(我有两个),然后基于这些最大和最小值对每个特征进行缩放,但我无法弄清楚如何实现。非常欢迎任何指针。
1个回答

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接