我有一个形状(1948, 60, 2, 3)
的4D阵列,它告诉60个时间步长的末端效应器位置(x,y,z)的差异。
数字1948
表示样本数量,60
表示时间步数,2
表示left_arm和right_arm,3
表示x,y,z位置。
它的外观样本如下:
array([[[ 3.93048840e-05, 7.70215296e-04, 1.13865805e-03],
[ 1.11679799e-04, -7.04810066e-04, 1.83552688e-04]],
[[ -6.26468389e-04, 6.86668923e-04, 1.57112482e-04],
[ 3.68164582e-04, 7.98948528e-04, 4.50642200e-04]],
[[ 2.51472961e-04, -2.48105983e-04, 7.52486843e-04],
[ 8.99905240e-05, 1.70473461e-04, -3.09927572e-04]],
[[ -7.52414330e-04, 5.46782063e-04, -3.76679264e-04],
[ -3.12531026e-04, -3.36585211e-04, 5.79075595e-05]],
[[ 7.69968002e-04, -1.95524291e-03, -8.65666619e-04],
[ 2.37583215e-04, 4.59415986e-04, 6.07292643e-04]],
[[ 1.41795261e-03, -1.62364401e-03, -8.99673829e-04],
我想将这些数据标准化,因为我需要在神经网络上下雨。我如何规范4D阵列我对图像有直觉。我可以规范化每个示例数据,还是应该对整个4D阵列进行归一化?
答案 0 :(得分:0)
首先,是的,你可以做标准化,没有问题。
其次,4D阵列没什么特别之处。对于每个特征,应该单独执行标准化。因此,根据标准化的类型,您应该计算训练集中所有样本的每个要素的最大值和最小值(或平均值和标准值)。
在您的情况下,您应该决定数据的哪些部分引用相同的分布。因此,决定每个方面:
1)第一维只是样本数,因此不会进行新的分发。将其视为数据条目的数量。
2)时间步。在这里,您应该决定:x,y,z值是否在60个时间步长中具有唯一分布?如果不是,请按照与上一步相同的方式对待它。如果是,则为每个时间步骤分别计算后续特征的max,min(或mean,std)。 (为简单起见,想想步骤0中的arm实际上是否有类似于30,60的值?如果是,则它们都对应于数据条目,no:x60特征)
3)左臂和右臂是否有不同的x,y,z值?如果是,请再次单独计算。 (我猜他们这样做,因为左右手臂在统计上倾向于占据空间中的不同点)
4)x,y,z值绝对是独立分布,因此请单独计算。
现在,当您决定使用3到360之间的功能时(取决于您的决定),请为它们计算必要的值(max,min或mean,std)并执行标准例程。
希望它有所帮助!
答案 1 :(得分:0)
诀窍是使用keepdims
设置为True
,这可以让广播发生,而不会因为扩展暗淡的内务工作而烦扰我们。因此,处理通用维度数组的通用ndarray的解决方案是 -
# Get min, max value aming all elements for each column
x_min = np.min(x, axis=tuple(range(x.ndim-1)), keepdims=1)
x_max = np.max(x, axis=tuple(range(x.ndim-1)), keepdims=1)
# Normalize with those min, max values leveraging broadcasting
out = (x - x_min)/ (x_max - x_min)