我有这段代码:
position = {}
for x in range(imdim[0]-shapesize+1):
for y in range(imdim[1]-shapesize+1):
curim = im[x:x+shapesize,y:y+shapesize]
shapedict = {}
for shapeid,(shape,contour) in enumerate(zip(shapes,contours)):
values = {}
curshape = curim[shape]
curcontour = curim[contour]
values['meandiff'] = curshape.mean()-curcontour.mean()
values['maxmin'] = int(curshape.min())-int(curcontour.max())
shapedict[shapeid] = values
position[(x,y)] = shapedict
return position
...其中im是一个图像(numpy数组),imdim它的形状,形状和轮廓是比im更小的二维数组列表(shapesize * shapesize)。
它确实有效,但我想知道是否有一种方法可以在词典理解,初始风格中写出所有这些内容。如果是,它会跑得更快吗?
此外,欢迎任何关于样式或优化的评论!
答案 0 :(得分:1)
我认为这应该做,但我没有真正测试它:
position = {
(x, y): {
shapeid: {'meandiff': curim[shape].mean() - curim[contour].mean(),
'maxmin': int(curim[shape].min()) - int(curim[contour].max())}
for shapeid,(shape,contour) in enumerate(zip(shapes,contours))
}
for (x,y,curim) in ((x, y, im[x:x+shapesize, y:y+shapesize])
for x in range(imdim[0]-shapesize+1)
for y in range(imdim[1]-shapesize+1)
)
}
棘手的部分是您定义的临时变量。对于curim
,我创建了一个内部生成器表达式,否则您必须将该表达式写入四次。您可以对curshape
和curcontour
执行相同的操作,但我认为它不值得额外的嵌套级别。
它是否更快:可能不是,当然不是很明显。恕我直言,更重要的是代码的可读性。这当然是一个意见问题。就个人而言,我认为它比原始代码更具可读性。