SciPy 是一个开源的 Python 算法库和数学工具包。

Scipy 是基于 Numpy 的科学计算库,用于数学、科学、工程学等领域,很多有一些高阶抽象和物理模型需要使用 Scipy。

SciPy 包含的模块有最优化、线性代数、积分、插值、特殊函数、快速傅里叶变换、信号处理和图像处理、常微分方程求解和其他科学与工程中常用的计算。

1. 旋转变量

1.1. 引入旋转变量

from scipy.spatial.transform import Rotation as R
import numpy as np

1.2. 与numpy.array类型的相互转换

x = 0
y = 0
z = 0
w = 1

# 由欧拉角输入
r = R.from_euler('zyx', [0.7854, 0.1, 0], degrees=False)  #欧拉角->旋转矩阵

# 由四元数输入
r = R.from_quat([x, y, z, w])

# 由四元数列表输入,输出也是旋转的列表
r = R.from_quat([[x, y, z, w]])

# 由轴角输入
r = R.from_rotvec(np.array([0, 0, np.pi/2]))

# 由旋转矩阵输入
r = R.from_matrix([[0, -1, 0],
                  [1, 0, 0],
                  [0, 0, 1]])

# 转换为轴角
r.as_rotvec() #这就是轴角,类型为numpy.array

# 转换为四元数
r.as_quat() # 四元数x, y, z, w

# 转换为矩阵
matrix = r.as_matrix()

# 转换为欧拉角
r.as_euler('zxy', degrees=True) # 'zxy'设置了输出的数组中各位代表绕哪个轴的旋转

1.3. 旋转变量叠加

p = R.from_quat([[0, 0, 1, 1], [1, 0, 0, 1]])
q = R.from_rotvec([[np.pi/4, 0, 0], [-np.pi/4, 0, np.pi/4]])
r = p * q

1.4. 作用于向量

1.4.1. 一个旋转变量作用于一个向量

vector = np.array([1, 0, 0])
r = R.from_rotvec([0, 0, np.pi/2])
r.apply(vector)

1.4.2. 一个旋转变量作用于多个向量

vectors = np.array([[1, 0, 0],
                    [1, 2, 3]])
r = R.from_rotvec([0, 0, np.pi/4])
r = r.apply(vectors)

1.4.3. 多个旋转变量作用于一个向量

r = R.from_rotvec([[0, 0, np.pi/4], [np.pi/2, 0, 0]])
vector = np.array([1, 2, 3])
r = r.apply(vector)

1.4.4. 多个旋转变量作用于多个向量

 每个旋转变量作用于相对应的向量上

r = R.from_euler('zxy', [[0, 0, 90], 
                        [45, 30, 60]], degrees=True)
vectors = [[1, 2, 3],
          [1, 0, -1]]
r.apply(vectors)

2. 插值

2.1. 一维插值

一次插值kind='inear'

二次插值kind='quadratic'

三次插值kind='cubic'

此外还有0阶插值nearest和zero方法

import matplotlib.pyplot as plt
from scipy import interpolate

x = np.arange(0, 10)
y = np.exp(-x / 3.0)
f = interpolate.interp1d(x, y)

2.2. 二维插值

from scipy import interpolate

x = np.arange(-5.01, 5.01, 0.25)
y = np.arange(-5.01, 5.01, 0.25)
xx, yy = np.meshgrid(x, y)
z = np.sin(xx**2 + yy**2)
f = interpolate.interp2d(x, y, z, kind='cubic')

2.3. n维插值

from scipy.interpolate import interpn

def value_func_3d(x, y, z):
    return 2 * x + 3 * y - z

x = np.linspace(0, 4, 5)
y = np.linspace(0, 5, 6)
z = np.linspace(0, 6, 7)
points = (x, y, z)
values = value_func_3d(*np.meshgrid(*points, indexing='ij'))

2.4. 旋转插值

from scipy.spatial.transform import Rotation as R
from scipy.spatial.transform import Slerp

key_rots = R.random(5, random_state=2342345)
key_times = [0, 1, 2, 3, 4]

# 构建对象,确定对应的时间和旋转量,Create the interpolator object:
slerp = Slerp(key_times, key_rots)

# 对于新的时间进行插值,Interpolate the rotations at the given times:
times = [0, 0.5, 0.25, 1, 1.5, 2, 2.75, 3, 3.25, 3.60, 4]
interp_rots = slerp(times)

参考文献

SciPy 教程 | 菜鸟教程
Numpy and Scipy Documentation — Numpy and Scipy documentation

scipy.spatial.transform.Rotation.apply — SciPy v1.11.0.dev0+1455.d0aa989 Manual

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐