我一直在写一个程序来强力检查一系列数字来寻找欧拉砖,但我想出的方法涉及一个三重循环。由于嵌套的Python循环变得非常慢,我想知道是否有更好的方法使用numpy来创建我需要的值数组。
#x=max side length of brick. User Input.
for t in range(3,x):
a=[];b=[];c=[];
for u in range(2,t):
for v in range(1,u):
a.append(t)
b.append(u)
c.append(v)
a=np.array(a)
b=np.array(b)
c=np.array(c)
...
有没有更好的方法来生成数组af值,使用numpy命令?
感谢。
实施例: 如果x = 10,当t = 3时我想得到:
a=[3]
b=[2]
c=[1]
第一次通过循环。之后,当t = 4时:
a=[4, 4, 4]
b=[2, 3, 3]
c=[1, 1, 2]
第三次(t = 5)我想要:
a=[5, 5, 5, 5, 5, 5]
b=[2, 3, 3, 4, 4, 4]
c=[1, 1, 2, 1, 2, 3]
等等,最大边长约为5000左右。
编辑:解决方案
a=array(3)
b=array(2)
c=array(1)
for i in range(4,x): #Removing the (3,2,1) check from code does not affect results.
foo=arange(1,i-1)
foo2=empty(len(foo))
foo2.fill(i-1)
c=hstack((c,foo))
b=hstack((b,foo2))
a=empty(len(b))
a.fill(i)
...
现在工作速度提高了很多倍。谢谢大家。
答案 0 :(得分:2)
尝试使用.empty和.fill(http://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.fill.html)
答案 1 :(得分:1)
有几件事可能会有所帮助,但可能只适用于较大的x值。对于初学者来说,使用xrange
代替range
,这将节省创建您永远不需要的列表。您还可以创建正确长度的空numpy数组,并随时使用值填充它们,而不是附加到列表然后将其转换为numpy数组。
我相信这段代码可行(此时没有python访问权限):
for t in xrange(3, x):
size = (t - 2) * (t - 3)
a = np.zeros(size)
b = np.zeros(size)
c = np.zeros(size)
idx = 0
for u in xrange(2,t):
for v in xrange(1,u):
a[idx] = t
b[idx] = u
c[idx] = v
idx += 1