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