首页 > 解决方案 > 从矩阵中的单个点获取所有方向的数组

问题描述

从 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,更不用说用于简单任务的大量代码了。有任何想法吗?

标签: pythonarrayslistnumpy

解决方案


一种方法是对阵列进行切片、切块、扭曲和破坏。这是一个功能,它就是这样做的......无论“那个”是什么。

数组:

>>> 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])}

推荐阅读