对角Numpy切片

时间:2018-03-28 19:41:57

标签: python numpy numpy-broadcasting numpy-slicing

我想在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]]

非常感谢任何提示和指南。

2 个答案:

答案 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