我通过使用两个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
答案 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。因此,请考虑一下。