我想在3个坐标之间切片2D numpy数组,例如,给定这个numpy,
[[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]]
和坐标(1,1)(3,1)(3,5),我想要这个:
[[0 0 0 0 0 0 0 0]
[0 1 0 0 0 0 0 0]
[0 1 1 1 0 0 0 0]
[0 1 1 1 1 1 0 0]]
非常感谢任何提示和指南。
答案 0 :(得分:1)
np.tri...
系列函数的核心函数是np.tri
。
看看它的代码,我们看到它(对于一个方阵):
In [36]: np.greater_equal.outer(np.arange(4),np.arange(+1, 4+1))
Out[36]:
array([[False, False, False, False],
[ True, False, False, False],
[ True, True, False, False],
[ True, True, True, False]])
玩弄我可以产生更接近你的例子的东西:
In [39]: np.greater_equal.outer(np.arange(4),.5*np.arange(+1, 8+1))
Out[39]:
array([[False, False, False, False, False, False, False, False],
[ True, True, False, False, False, False, False, False],
[ True, True, True, True, False, False, False, False],
[ True, True, True, True, True, True, False, False]])
In [40]: _.astype(int)
Out[40]:
array([[0, 0, 0, 0, 0, 0, 0, 0],
[1, 1, 0, 0, 0, 0, 0, 0],
[1, 1, 1, 1, 0, 0, 0, 0],
[1, 1, 1, 1, 1, 1, 0, 0]])
这是否是一种有用的方法取决于你想要的三角形的一般情况。该示例是传统下三角形的变体。但如果要点更一般,请说:
(1,1), (3,2), (2,6)
你必须想出更复杂的
答案 1 :(得分:0)
基于此answer,我们需要检查三角形的每个边缘,如果边缘沿逆时针方向定向,我们可以测试点是否位于边缘的左侧。如果所有边缘均通过测试,则该点在内部。如果至少有一个失败-该点在外面。
要测试点gcloud builds submit --tag gcr.io/mycompany.com/project-id/helloworld
是否位于边缘(xp, yp)
的左侧,您只需要计算:
(x1, y1) - (x2, y2)
如果为D = (x2 - x1) * (yp - y1) - (xp - x1) * (y2 - y1)
,则该点位于左侧。如果为D > 0
,则该点在右侧。如果为D < 0
,则该点在直线上。
代码如下:
D = 0
这是结果:
def triangular_slicing(input, (x1, y1), (x2, y2), (x3, y3)):
for i in range(input.shape[0]):
for j in range(input.shape[1]):
D = (x2 - x1) * (j - y1) - (i - x1) * (y2 - y1)
if D >= 0:
D = (x3 - x2) * (j - y2) - (i - x2) * (y3 - y2)
if D >= 0:
D = (x1 - x3) * (j - y3) - (i - x3) * (y1 - y3)
if D >= 0:
input[i][j] = 1
return input