python - 从矩阵中的单个点获取所有方向的数组
问题描述
从 8 个方向中的每一个方向的二维矩阵中的一个点获取表示值行的列表的 pythonic 方法是什么?例如,如果我有:
array([[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19],
[20, 21, 22, 23, 24]], dtype=object)
我选择点 (1,2)(值 11),我会得到 (1,2) 上方的点列表,直到顶部,即 [6,1]。我还将列表转到右上角,直到达到 [7,3] 的边缘。等等,用于 8 个方向中的每一个。我不想为每个方向使用单独的 for 循环,这似乎很不合 Python,更不用说用于简单任务的大量代码了。有任何想法吗?
解决方案
一种方法是对阵列进行切片、切块、扭曲和破坏。这是一个功能,它就是这样做的......无论“那个”是什么。
数组:
>>> a = np.arange(25, dtype=int).reshape([5, 5])
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19],
[20, 21, 22, 23, 24]])
示例代码:
def directions(a, r, c) -> dict:
"""Return all vectors from an ndarray.
Args:
a (np.ndarray): Array.
r (int): Starting row.
c (int): Starting column.
:Directions:
1: up
2: up/right
3: right
4: down/right
5: down
6: down/left
7: left
8: up/left
Returns:
A dict containing all eight directions of rotation,
starting with the top, moving clockwise.
"""
v = {}
v['1'] = a[r-1::-1, c]
v['2'] = np.diagonal(a[r::-1, c:])[1:]
v['3'] = a[r, c+1:]
v['4'] = np.diagonal(a[r:, c:])[1:]
v['5'] = a[r+1:, c]
v['6'] = np.diagonal(a[r:, c::-1])[1:]
v['7'] = a[r, c-1::-1]
v['8'] = np.diagonal(a[r::-1, c::-1])[1:]
return v
输出:
>>> directions(a, 2, 1)
{'1': array([6, 1]),
'2': array([7, 3]),
'3': array([12, 13, 14]),
'4': array([17, 23]),
'5': array([16, 21]),
'6': array([15]),
'7': array([10]),
'8': array([5])}
推荐阅读
- vb.net - 使用 DropdownStyle=DropDownList 在下拉列表中忽略输入按键
- string - Like 运算符无法检测到字符串中的字符
- docker - 运行 JIB 镜像创建的容器
- jquery - 如何在codeigniter的视图中将值从控制器传递给jquery
- dart - Flutter:使用全局流?
- arrays - 尝试对两个数组的字节求和时出现溢出异常
- axapta - Dynamics 365 数据管理项目的版本控制
- java - 安装 APK 时出现未知故障(在 android.os.Binder.execTransact(Binder.java:674))错误
- docker - 如何将 docker-compose 与 tomcat 一起使用
- javascript - rollupjs 配置问题[编辑:已修复]