gpt4 book ai didi

python - 用numpy插入一个角度的旋转

转载 作者:太空狗 更新时间:2023-10-30 01:09:20 26 4
gpt4 key购买 nike

我有一个

x = ..
y = ..
p = np.matrix([[x],[y]])

并且我希望以 d 度为增量围绕原点旋转该点以获得 N = 360/d 点。例如我想象以下功能。

points = interpolate360(d, p)

点的形状应该是(2,N)

我可以在循环中为每次旋转使用一个新的旋转矩阵来执行代码,然后连接结果,但我希望得到某种矢量化解决方案。

最佳答案

在大多数情况下,使用 numpy 的 matrix 可能不是最好的主意。解决问题的一种方法是创建一个 3D 数组,其中 [n, :, :] 保存第 n 角度的旋转矩阵。你不能有一个 3D matrix,所以如果你混合数组和矩阵类型并且仍然想依赖 * 做矩阵乘法,它会变得困惑。如果您坚持使用数组,并且 np.dot 可以预测地处理矩阵乘法,则以下代码可以很好地工作。它实际上也需要一个矩阵,但首先将它转换为一个ndarray:

def interpolate360(d, p):
p = np.array(p)
angles = np.arange(0, 2 * np.pi, d * np.pi / 180)
sin = np.sin(angles)
cos = np.cos(angles)

rot_matrices = np.empty((angles.shape[0], 2, 2))
rot_matrices[..., 0, 0] = cos
rot_matrices[..., 0, 1] = -sin
rot_matrices[..., 1, 0] = sin
rot_matrices[..., 1, 1] = cos

return np.dot(rot_matrices, p)

如以下示例所示,如果您的输入是一维行向量、二维单列向量或包含多个列向量的二维数组,则此方法有效:

>>> interpolate360(90, [0, 1])
array([[ 0.00000000e+00, 1.00000000e+00],
[ -1.00000000e+00, 6.12323400e-17],
[ -1.22464680e-16, -1.00000000e+00],
[ 1.00000000e+00, -1.83697020e-16]])
>>> interpolate360(90, [[0], [1]])
array([[[ 0.00000000e+00],
[ 1.00000000e+00]],

[[ -1.00000000e+00],
[ 6.12323400e-17]],

[[ -1.22464680e-16],
[ -1.00000000e+00]],

[[ 1.00000000e+00],
[ -1.83697020e-16]]])
>>> interpolate360(90, [[1, 0], [0, 1]])
array([[[ 1.00000000e+00, 0.00000000e+00],
[ 0.00000000e+00, 1.00000000e+00]],

[[ 6.12323400e-17, -1.00000000e+00],
[ 1.00000000e+00, 6.12323400e-17]],

[[ -1.00000000e+00, -1.22464680e-16],
[ 1.22464680e-16, -1.00000000e+00]],

[[ -1.83697020e-16, 1.00000000e+00],
[ -1.00000000e+00, -1.83697020e-16]]])

关于python - 用numpy插入一个角度的旋转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14232588/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com