我有一个巨大的3D坐标向量,我想对它们进行标准化,使它们位于维度[0,1] x [0,1] x [0,1]的立方体内(即每个x,y ,坐标的z应该在0和1之间,我正在做的是将所有坐标除以该向量中3D坐标的最大长度,但是这样我就不能用负值处理坐标。有谁能建议将这些坐标标准化的正确方法是什么?
答案 0 :(得分:6)
将每个组件除以向量的长度:
length = sqrt(x ^ 2 + y ^ 2 + z ^ 2)
所以你的标准化向量是:
v =(x /长度,y /长度,z /长度)
答案 1 :(得分:0)
作为示例,我们定义一个称为v的矩阵:
import numpy as np
v = np.array([[[-1,2,3], [4,5,6]]])
v
array([[[-1, 2, 3],
[ 4, 5, 6]]])
我在这里要做的第一件事是查看最小和最大之间当前的数字范围。由于我们希望最小值为0.0,最大值为1.0,因此必须在旧数值范围之间除以新范围(1.0-0.0,最大值减去最小值),即1.0。
scaled_unit = 1.0 / (np.max(v) - np.min(v))
通过这种划分,可以达到新单元的要求。
要将每个旧值转换为新值,我们将其乘以缩放单位,然后再次减去最小值乘以缩放单位。
v*scaled_unit - np.min(v)*scaled_unit
array([[[0. , 0.42857143, 0.57142857],
[0.71428571, 0.85714286, 1. ]]])
然后,我们获得所有值以保持它们之间的比例,并将其包含在最小值的0.0和最大值的1.0之间。
重要提示:仅当所有值的大小都相同时,才可以使用此解决方案。如果某些数字代表米,而其他千克则应独立缩放。