【发布时间】:2020-08-13 23:35:05
【问题描述】:
所以我尝试了这个,我发现它真的不可行。我不太了解执行以下操作的聪明方法。有人可以帮忙吗?列表的输入也很大。
此任务是根据我生成的值创建图像。 center_star 包含 [x,y] 对的列表,它们是各种点状对象的中心。
1800 值表示要生成的图像为 1800x1800 像素。
Sigma 变量默认值为 2。
final=[[0]*1800]*1800
for i in range(len(center_stars)):
xi=center_stars[i][0]
yi=center_stars[i][1]
print(i)
for j in range(1800):
for k in range(1800):
final[j][k]+=gauss_amplitude[i]*(math.e**((-1*((xi-j)**2+(yi-k)**2))/2*sigma*sigma))
有没有更聪明的方法来使用一些 numpy 操作来节省时间并在更短的时间内执行这段代码?
【问题讨论】:
-
作为一个小修复,保存重复使用的表达式。
2*sigma*sigmawhile small 每次循环都会重新计算。您应该将此表达式保存在 i 上的循环之外。类似地,在 k 上的循环中,即使 j 没有变化,您也会在每次迭代时重新计算(xi-j)**2。 -
这看起来像是用
numpy进行矢量化。 -
列表
final的所有 1800 个元素都是相同的列表!,在循环中更改final[j][k]将更改 ALLfinal[:][k]s。可能不是你想要的。绝对使用 numpy。 -
顺便说一句,你知道
a=[[0]*2]*2;a[0][0]=1;a[1][0]显示1吗?*创建对同一个 object 的多个引用,这对于 1D 中的不可变数字来说不是问题,但对于 2nd 维的列表来说却是问题。请改用列表推导,例如b=[[0 for i in range(2)] for j in range(2)];b[0][0]=1;b[1][0],它显示0。
标签: python numpy loops optimization