3d 将三维坐标向量规格化为介于0和1之间

3d 将三维坐标向量规格化为介于0和1之间,3d,coordinates,normalization,3d,Coordinates,Normalization,我有一个巨大的三维坐标向量,我想对它们进行规格化,使它们位于[0,1]x[0,1]x[0,1]的立方体内(也就是说,坐标的每个x,y,z应该在0和1之间),我所做的是将所有坐标除以这个向量中3D坐标的最大长度,但是用这种方法我不能处理带负值的坐标。谁能建议一下规范化这些坐标的正确方法吗?只需将每个分量除以向量的长度: 长度=sqrt(x^2+y^2+z^2) 所以你的标准化向量是: v=(x/length,y/length,z/length)作为示例,我们定义了一个称为v的矩阵: 将numpy导

我有一个巨大的三维坐标向量,我想对它们进行规格化,使它们位于[0,1]x[0,1]x[0,1]的立方体内(也就是说,坐标的每个x,y,z应该在0和1之间),我所做的是将所有坐标除以这个向量中3D坐标的最大长度,但是用这种方法我不能处理带负值的坐标。谁能建议一下规范化这些坐标的正确方法吗?

只需将每个分量除以向量的长度:

长度=sqrt(x^2+y^2+z^2)

所以你的标准化向量是:


v=(x/length,y/length,z/length)

作为示例,我们定义了一个称为v的矩阵:

将numpy导入为np
v=np.数组([-1,2,3],[4,5,6]])
v
数组([-1,2,3],
[ 4,  5,  6]]])
还有一系列:

new_range=(0,1)
最大范围=最大(新范围)
最小范围=最小(新范围)
我在这里做的第一件事是看看当前最小值和最大值之间的数字范围是多少。因为我们希望最小值为0.0,最大值为1.0,所以我们必须将范围(1.0-0.0,最大值减去最小值),即1.0,除以旧的数字范围

scaled_单位=1.0/(np.max(v)-np.min(v))
或者通常(使用上述范围
新范围
):

scaled_单位=(最大范围-最小范围)/(np.max(v)-np.min(v))
有了这个部门,我们就可以实现被视为新单位的目标

要将每个旧值转换为新值,我们将其乘以缩放单位,再减去最小值乘以缩放单位。然后我们求和
min\u范围

v*缩放单位-np.min(v)*缩放单位+最小范围
数组([[0,0.42857143,0.57142857],
[0.71428571, 0.85714286, 1.        ]]])
然后我们得到所有的值,以保持它们之间的比例,并且最小值包含在0.0和最大值包含在1.0之间。这也可以用来扩展到我们需要的任何范围

例如:

v=np.array([-1,2,3],[4,5,6]]
def scale_numpy_阵列(arr、min_v、max_v):
新范围=(最小值,最大值)
最大范围=最大(新范围)
最小范围=最小(新范围)
缩放单位=(最大范围-最小范围)/(np.max(arr)-np.min(arr))
返回arr*缩放单位-np.min(arr)*缩放单位+最小范围
缩放数组(v,-1,1)
数组([-1.,-0.14285714,0.14285714],
[ 0.42857143,  0.71428571,  1.        ]]])
比例数组(v,-10,-1)
数组([-10.,-6.14285714,-4.85714286],
[ -3.57142857,  -2.28571429,  -1.        ]]])

我想将它们保持在0和1之间,如果例如x的a为负怎么办?我也要处理这个问题好吧,把标准化向量除以2,再加上和向量(0.5,0.5,0.5),他说3d坐标向量,所以你可能需要找到每个轴的上下限之间的范围,并用最大值来缩放其余的,因为在这个网站上,只有代码的答案通常是不受欢迎的。请编辑您的答案,包括一些注释或对代码的解释,好吗?解释应该回答这样的问题:它做什么?它是如何做到的?它去哪里了?它如何解决OP的问题?请参阅:。谢谢我用更多的评论更新了答案,对不起。英语不是我的语言,尽管如此,我还是想帮忙。