5

私は単一のポイントを持っています

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

そして、その点を原点を中心にd度ずつ回転させて、 N = 360/d点を取得したいと思います。たとえば、次の関数を想像します。

points = interpolate360(d, p)

ポイントの形状は(2、N)である必要があります

回転ごとに新しい回転行列を使用してループ内でコードを実行し、結果を連結することはできますが、ある種のベクトル化されたソリューションを期待していました。

4

1 に答える 1

5

numpyを使用matrixすることは、ほとんどの設定でおそらく最善のアイデアではありません。問題を解決する1つの方法は、3D配列を作成することです。ここで、 -番目の角度[n, :, :]の回転行列を保持します。n3Dを使用することはできないため、配列タイプと行列タイプを混在させても、行列の乗算matrixに依存したい場合は、混乱する可能性があります。*配列に固執しnp.dot、行列の乗算を予測どおりに処理する場合は、次のコードが適切に機能します。実際にはもかかりますが、最初に:matrixに変換します。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)

以下の例が示すように、これは、入力が1D行ベクトル、2D単一列ベクトル、または複数の列ベクトルを保持する2D配列である場合に機能します。

>>> 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]]])
于 2013-01-09T14:42:43.983 に答える