如何在numpy数组上制作不平行于xy轴的线罩?

时间:2018-09-24 08:55:16

标签: python arrays numpy

import numpy as np
a = np.zeros((10,10))
startx = 1
starty = 1
endx = 7
endy = 8

如何在数组(startx, starty) -> (endx, endy)上遮盖宽度为3的行a?有什么有效的方法吗?

1 个答案:

答案 0 :(得分:1)

如果我正确理解了您的问题,那么您想要一个二进制掩码,该掩码可以跟在数组中任何类型的行后面。

通常使用Bresenham's line algorithm或其变体来解决这类问题。 基本算法是众所周知的,在这里再次展示/重新实现它毫无意义。

无论如何,可以在pymrt.geometry.bresenham_line()中找到该算法的n维有效版本,其用法类似于:

import numpy as np
import pymrt as mrt
import pymrt.geometry

point_a = (1, 1)
point_b = (7, 8)
line_points = tuple(x for x in mrt.geometry.bresenham_line(point_a, point_b))

arr = np.zeros((10, 10))

for line_point in line_points:
    arr[line_point] = 1

print(arr)
# [[ 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.]
#  [ 0.  1.  0.  0.  0.  0.  0.  0.  0.  0.]
#  [ 0.  0.  1.  0.  0.  0.  0.  0.  0.  0.]
#  [ 0.  0.  0.  1.  0.  0.  0.  0.  0.  0.]
#  [ 0.  0.  0.  0.  1.  1.  0.  0.  0.  0.]
#  [ 0.  0.  0.  0.  0.  0.  1.  0.  0.  0.]
#  [ 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.]
#  [ 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.]
#  [ 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.]
#  [ 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.]]

免责声明:我是PyMRT的主要作者。

编辑

或者,您可以考虑使用bresenham Python软件包,它是一种高效的2D实现。