5

我有一个巨大的 3D 坐标向量,我想对它们进行归一化,使它们位于维度为 [0,1] x [0,1] x [0,1] 的立方体内(即,每个 x,y,z坐标应该在 0 和 1 之间),我正在做的是将所有坐标除以该向量中 3D 坐标的最大长度,但是这样我不能处理负值的坐标。谁能建议标准化这些坐标的正确方法是什么?

4

2 回答 2

13

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

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

所以你的归一化向量是:

v = ( x / 长度, y / 长度, z / 长度)

于 2013-10-10T16:23:29.690 回答
3

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

import numpy as np

v = np.array([[[-1,2,3], [4,5,6]]])
v
array([[[-1,  2,  3],
        [ 4,  5,  6]]])

还有一个范围:

new_range = (0, 1)
max_range = max(new_range)
min_range = min(new_range)

我在这里做的第一件事是查看最小值和最大值之间的当前数字范围。由于我们希望最小值为 0.0,最大值为 1.0,因此我们必须在旧的数字范围之间划分范围(1.0 - 0.0,最大值减去最小值),即 1.0。

scaled_unit = 1.0 / (np.max(v) - np.min(v))

或者通常(使用上述范围new_range):

scaled_unit = (max_range - min_range) / (np.max(v) - np.min(v))

通过这个部门,一个人实现了将被视为新单位的东西。

要将每个旧值转换为新值,我们将其乘以缩放单位,然后再减去乘以缩放单位的最小值。然后我们总结min_range

v*scaled_unit - np.min(v)*scaled_unit + min_range
array([[[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_array(arr, min_v, max_v):
    new_range = (min_v, max_v)
    max_range = max(new_range)
    min_range = min(new_range)
    scaled_unit = (max_range - min_range) / (np.max(arr) - np.min(arr))
    return arr*scaled_unit - np.min(arr)*scaled_unit + min_range


scale_numpy_array(v, -1, 1)
array([[[-1.        , -0.14285714,  0.14285714],
        [ 0.42857143,  0.71428571,  1.        ]]])


scale_numpy_array(v, -10, -1)
array([[[-10.        ,  -6.14285714,  -4.85714286],
        [ -3.57142857,  -2.28571429,  -1.        ]]])
于 2019-10-01T18:24:35.423 回答