python - 有没有更简单的方法来转换这个 scipy 稀疏矩阵?
问题描述
我想使用稀疏矩阵来存储激光测距仪检测到的占用/空闲空间的“地图”。我认为稀疏矩阵非常适合这个问题,因为环境中有更多的可用空间(用 0 表示),而不是障碍物(用 1 表示,或在 0 和 1 之间的浮点数表示概率)。
获取此地图后,作为匹配算法的一部分,我想对其应用不同的空间变换,例如但不一定限于旋转和平移。
作为转换部分的概念证明,我在坐标格式 ( coo_matrix
) 中定义了这个小的 SciPy 稀疏矩阵,如下所示:
import numpy as np
from scipy import sparse
row = np.array([2])
col = np.array([2])
data = np.array([1])
shape = (4, 4)
m = sparse.coo_matrix((data, (row, col)), shape)
m.toarray()
array([[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 1, 0],
[0, 0, 0, 0]])
例如,我想将此矩阵围绕其中心逆时针旋转 90 度,以获得这个新矩阵:
array([[0, 0, 0, 0],
[0, 0, 1, 0],
[0, 0, 0, 0],
[0, 0, 0, 0]])
我所做的是:
- 获取非零点的坐标:
point = [m.col[0], m.row[0], 1]
[2, 2, 1]
- 计算对应于 a) 将中心置于
(1.5, 1.5)
和 b) 逆时针旋转 90 度对应的变换矩阵:
rot = np.array([[0, -1, 3],[1, 0, 0],[0, 0, 1]])
array([[ 0, -1, 3],
[ 1, 0, 0],
[ 0, 0, 1]])
- 通过将 1) 处的点与 2) 处的矩阵相乘来应用变换:
rot.dot(point)
array([1, 2, 1])
它有效地将点旋转到(2,2)
to (1,2)
(或(1,2,1)
在相同的齐次坐标中),中心位于(1.5, 1.5)
.
现在,这感觉相当“手动”。有没有更短的方法来应用这种转换?我知道 scipy 支持一些基于四元数的旋转,但我对一种通用方法更感兴趣,这种方法不仅可以包括旋转,还可以包括平移和基本上任何转换(无论如何,scipy 现在只支持旋转)。
有没有一种更直接的方法来转换这个矩阵,而不必手动a)从坐标构建每个非零点,b)将转换应用于每个点?
注意:我使用稀疏矩阵是为了方便和存储,但如果作为中间步骤,它必须转换为另一种格式、转换并转换回稀疏矩阵,那也没关系。
谢谢!
解决方案
推荐阅读
- sql - 您如何更改 2019 SSRS 报告以打开 Chrome 浏览器而不是 Internet Explorer
- flutter - 使用用户配置文件进行颤振状态管理
- python - Python BeautifulSoup 从动态页面获取 html
- html - 如何根据css中的网页修复背景?
- c# - '无法加载文件或程序集'System.Windows,Version=5.0.5.0,Culture=neutral,PublicKeyToken=7cec85d7bea7798e'或其依赖项之一
- python - Pygsheets.authorize 每次运行时生成 tmp 文件
- swift - 在 Swift 上的应用程序后台运行任务
- visual-studio - 如何在 VS Community 2019 调试器中检查 Blazor Wasm 服务类数据
- python - 我的代码中的 pandas to csv 有什么问题?
- google-chrome - Chrome 扩展:如何在新选项卡中识别和显示 PDF,而不是使用特定标题下载