gpt4 book ai didi

python - 生成具有对角边缘的数组的 Pythonic 方法是什么?

转载 作者:行者123 更新时间:2023-12-02 05:58:37 25 4
gpt4 key购买 nike

我使用两个 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

输出(im_size = 5):

>>> im_size
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]], dtype=int8)

最佳答案

一般来说,在使用 numpy 时,最好使用向量化方法,随着所需数组大小的增加,该方法将比使用循环和列表推导式的方法快得多。

>>> 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水平翻转数组

与其他答案的时间比较:

enter image description here

如图所示,当 n>=10 时,numpy 方法速度更快,并且随着 n 变大,该方法往往比列表理解解决方案快 10 倍左右。

重现代码:

import perfplot
import numpy as np

def cdjb(n):
return np.flip(np.tril(np.ones((n,n)), k=-1), 1)

def displayname(n):
return [[int(j > i) for j in range(n)] for i in range(n)][::-1]

def MikeMajara(n):
return [[1 if i+j >= n else 0 for i in range(n)] for j in range(n)]

perfplot.show(
setup=lambda n: n,
n_range=[2**k for k in range(14)],
kernels=[
cdjb,displayname,MikeMajara
],
xlabel='Size of Array',
)

关于python - 生成具有对角边缘的数组的 Pythonic 方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58956251/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com