【scipy 基礎】--空間計算

2023-11-27 09:01:01

scipy.spatial子模組提供了一系列用於處理和計算空間資料和幾何形狀的演演算法和工具,在許多領域都有廣泛的應用,例如計算機視覺、地理資訊系統、機器人學、醫學影像分析等。

下面,來具體看看scipy.spatial子模組為我們提供的主要功能分類。

1. 主要功能

scipy.spatial子模組中主要包含的功能有:

類別 說明
空間變換類 目前主要是三維旋轉類的函數
最近鄰查詢類 提供了基於樹結構的最近鄰搜尋演演算法,如K-d樹、球樹等,用於在大型空間資料集中快速找到最近鄰物件
距離度量類 提供了計算點、線、面等幾何形狀之間的距離的函數,包括歐幾里得距離、曼哈頓距離、切比雪夫距離等。
三角剖分、凸包類 提供了計算二維資料點的凸包的函數,即找到最小的凸多邊形來包含所有資料點等
單純形表示類 提供了三維幾何物件的方法,如三維點、向量、矩陣

2. 使用範例

下面演示兩個用scipy.spatial子模組中的函數實現的範例。

2.1. 凸包計算範例

給定任意個點,計算凸包就是計算包含給定點集中所有點的最小凸物件。

from scipy.spatial import ConvexHull
import numpy as np
import matplotlib.pyplot as plt

# 隨機生成100個點
points = np.random.rand(100, 2)
# 計算這些點的凸包
hull = ConvexHull(points)

# 繪製一個隨機點
plt.scatter(points[:, 0], points[:, 1], marker='o')
# 將位於凸包上的點用紅色線連線起來
for simplex in hull.simplices:
    plt.plot(points[simplex, 0], points[simplex, 1], 'r-')

plt.show()

2.2. 三維旋轉範例

使用scipy.spatial子模組來做三維旋轉非常簡單,它提了多種旋轉三維物體的方法,
可以通過尤拉角軸角旋轉向量四元組,以及旋轉矩陣

使用方式類似,下面演示的是用尤拉角來旋轉一個三維球體。
首先繪製一個球體:

import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure()
ax = fig.add_subplot(projection='3d')

# 球面點的資料
u = np.linspace(0, 2 * np.pi, 100)
v = np.linspace(0, np.pi, 100)
x = 10 * np.outer(np.cos(u), np.sin(v))
y = 10 * np.outer(np.sin(u), np.sin(v))
z = 10 * np.outer(np.ones(np.size(u)), np.cos(v))

ax.plot_surface(x, y, z, cmap=plt.cm.rainbow)

ax.set_aspect('equal')
ax.set_xlabel("x")
ax.set_ylabel("y")
ax.set_zlabel("z")

plt.show()

然後用 scipy.spatial 中的方法分別沿X軸旋轉45度沿Y軸旋轉90度

from scipy.spatial.transform import Rotation

# 沿著 "axis" 軸旋轉 "degree" 角度
def rotate(axis, degree):
    r = Rotation.from_euler(axis, degree, degrees=True)
    v = np.dstack((x, y, z))
    v = r.apply(v.reshape(-1, 3))
    v = v.reshape((*z.shape, 3))
    return v


fig, ax = plt.subplots(1, 2, subplot_kw={"projection": "3d"})

v = rotate('x', 45)
ax[0].plot_surface(v[:, :, 0], v[:, :, 1], v[:, :, 2], 
                   cmap=plt.cm.rainbow)
ax[0].set_aspect('equal')
ax[0].set_title("沿X軸旋轉45度")

v = rotate('y', 90)
ax[1].plot_surface(v[:, :, 0], v[:, :, 1], v[:, :, 2], 
                   cmap=plt.cm.rainbow)
ax[1].set_aspect('equal')
ax[1].set_title("沿Y軸旋轉90度")

plt.show()

3. 總結

總之,scipy.spatial子模組的重點應用領域有:
距離計算問題,通過計算點、線、面等幾何形狀之間的距離,可以用於影象配準、碰撞檢測、空間聚類等應用;
還有空間插值方法,可以將離散的空間資料轉換為連續的函數,用於影象處理、數值分析等領域;
凸包演演算法,用於影象處理中的物件識別、區域提取等任務;
幾何形狀操作方法,可以對二維或三維的幾何物件進行合併、相交、相減等操作,用於計算機圖學、機器人路徑規劃等應用;
最近鄰搜尋演演算法,在大型空間資料集中快速找到最近鄰物件,用於推薦系統、空間索引等應用;

此外,該子模組還提供了排列組合、階乘和伽馬函數等數學計算操作。