用对角线边缘表示数组的Python方法是什么?

时间:2019-11-20 14:06:31

标签: python arrays loops numpy list-comprehension

我通过使用两个for循环创建了一个具有对角线边缘的数组,但我想知道是否有更简单的方法来实现此目的,例如列表理解:

im_diag = np.zeros((im_size, im_size), dtype=np.int8)

for x in range(im_size):
    for y in range(im_size):
        if x+y >= im_size:
            im_diag[x,y] = 1

3 个答案:

答案 0 :(得分:5)

您可以尝试以下方法:

>>> np.flip(np.tril(np.ones((5,5)), k=-1), 1)
array([[0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 1.],
       [0., 0., 0., 1., 1.],
       [0., 0., 1., 1., 1.],
       [0., 1., 1., 1., 1.]])

np.ones创建一个1个数组,

np.tril创建一个较低的三角形数组

np.flip来水平翻转数组

答案 1 :(得分:1)

具有列表理解功能(无需numpy):

n = 5
[[int(j > i) for j in range(n)] for i in range(n)][::-1]

给予

[[0, 0, 0, 0, 0],
 [0, 0, 0, 0, 1],
 [0, 0, 0, 1, 1],
 [0, 0, 1, 1, 1],
 [0, 1, 1, 1, 1]]

其中[::-1]仅反转外部列表。

答案 2 :(得分:0)

如果您在寻找理解列表,这可能是您的解决方案:

[[1 if i+j >= im_size else 0 for i in range(im_size)] for j in range(im_size)]

但是,复杂的理解列表更难以阅读/理解。不可读的代码不是pythonic。因此,请考虑一下。