numpyを使用matrix
することは、ほとんどの設定でおそらく最善のアイデアではありません。問題を解決する1つの方法は、3D配列を作成することです。ここで、 -番目の角度[n, :, :]
の回転行列を保持します。n
3Dを使用することはできないため、配列タイプと行列タイプを混在させても、行列の乗算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]]])