我必须迭代两个1000x1000大的数组。我已经将分辨率降低到100x100以使迭代更快,但是对于一个阵列仍然需要大约15分钟! 所以我试图同时迭代这两个,为此我找到了:
for index, (x,y) in ndenumerate(izip(x_array,y_array)):
然后我收到错误:
ValueError: too many values to unpack
这是我的完整python代码:我希望你能帮助我更快地完成这项工作,因为这是我的硕士论文,最后我必须运行大约100次......
area_length=11
d_circle=(area_length-1)/2
xdis_new=xdis.copy()
ydis_new=ydis.copy()
ie,je=xdis_new.shape
while (np.isnan(np.sum(xdis_new))) and (np.isnan(np.sum(ydis_new))):
xdis_interpolated=xdis_new.copy()
ydis_interpolated=ydis_new.copy()
# itx=np.nditer(xdis_new,flags=['multi_index'])
# for x in itx:
# print 'next x and y'
for index, (x,y) in ndenumerate(izip(xdis_new,ydis_new)):
if np.isnan(x):
print 'index',index[0],index[1]
print 'interpolate'
# define indizes of interpolation area
i1=index[0]-(area_length-1)/2
if i1<0:
i1=0
i2=index[0]+((area_length+1)/2)
if i2>ie:
i2=ie
j1=index[1]-(area_length-1)/2
if j1<0:
j1=0
j2=index[1]+((area_length+1)/2)
if j2>je:
j2=je
# -->
print 'i1',i1,'','i2',i2
print 'j1',j1,'','j2',j2
area_values=xdis_new[i1:i2,j1:j2]
print area_values
b=area_values[~np.isnan(area_values)]
if len(b)>=((area_length-1)/2)*4:
xi,yi=meshgrid(arange(len(area_values[0,:])),arange(len(area_values[:,0])))
weight=zeros((len(area_values[0,:]),len(area_values[:,0])))
d=zeros((len(area_values[0,:]),len(area_values[:,0])))
weight_fac=zeros((len(area_values[0,:]),len(area_values[:,0])))
weighted_area=zeros((len(area_values[0,:]),len(area_values[:,0])))
d=sqrt((xi-xi[(area_length-1)/2,(area_length-1)/2])*(xi-xi[(area_length-1)/2,(area_length-1)/2])+(yi-yi[(area_length-1)/2,(area_length-1)/2])*(yi-yi[(area_length-1)/2,(area_length-1)/2]))
weight=1/d
weight[where(d==0)]=0
weight[where(d>d_circle)]=0
weight[where(np.isnan(area_values))]=0
weight_sum=np.sum(weight.flatten())
weight_fac=weight/weight_sum
weighted_area=area_values*weight_fac
print 'weight'
print weight_fac
print 'values'
print area_values
print 'weighted'
print weighted_area
m=nansum(weighted_area)
xdis_interpolated[index]=m
print 'm',m
else:
print 'insufficient elements'
if np.isnan(y):
print 'index',index[0],index[1]
print 'interpolate'
# define indizes of interpolation area
i1=index[0]-(area_length-1)/2
if i1<0:
i1=0
i2=index[0]+((area_length+1)/2)
if i2>ie:
i2=ie
j1=index[1]-(area_length-1)/2
if j1<0:
j1=0
j2=index[1]+((area_length+1)/2)
if j2>je:
j2=je
# -->
print 'i1',i1,'','i2',i2
print 'j1',j1,'','j2',j2
area_values=ydis_new[i1:i2,j1:j2]
print area_values
b=area_values[~np.isnan(area_values)]
if len(b)>=((area_length-1)/2)*4:
xi,yi=meshgrid(arange(len(area_values[0,:])),arange(len(area_values[:,0])))
weight=zeros((len(area_values[0,:]),len(area_values[:,0])))
d=zeros((len(area_values[0,:]),len(area_values[:,0])))
weight_fac=zeros((len(area_values[0,:]),len(area_values[:,0])))
weighted_area=zeros((len(area_values[0,:]),len(area_values[:,0])))
d=sqrt((xi-xi[(area_length-1)/2,(area_length-1)/2])*(xi-xi[(area_length-1)/2,(area_length-1)/2])+(yi-yi[(area_length-1)/2,(area_length-1)/2])*(yi-yi[(area_length-1)/2,(area_length-1)/2]))
weight=1/d
weight[where(d==0)]=0
weight[where(d>d_circle)]=0
weight[where(np.isnan(area_values))]=0
weight_sum=np.sum(weight.flatten())
weight_fac=weight/weight_sum
weighted_area=area_values*weight_fac
print 'weight'
print weight_fac
print 'values'
print area_values
print 'weighted'
print weighted_area
m=nansum(weighted_area)
ydis_interpolated[index]=m
print 'm',m
else:
print 'insufficient elements'
else:
print 'no need to interpolate'
xdis_new=xdis_interpolated
ydis_new=ydis_interpolated
答案 0 :(得分:2)
一些建议:
答案 1 :(得分:1)
您可以将其用作for
循环:
for index, x in ndenumerate((x_array,y_array)):
但它不会对你有多大帮助,因为你的计算机不能同时做两件事。
答案 2 :(得分:0)
注释#1:你不想在ndenumerate
迭代器上使用izip
,因为它会输出迭代器,这不是你想要的。
评论#2:
i1=index[0]-(area_length-1)/2
if i1<0:
i1=0
可以在i1 = min(index[0]-(area_length-1)/2, 0)
中简化,您可以将(area_length+/-1)/2
存储在特定变量中。
创意#1:尝试迭代平面版本的数组,例如
for (i, (x, y)) in enumerate(izip(xdis_new.flat,ydis_new.flat)):
您可以通过divmod(i, xdis_new.shape[-1])
获取原始索引,因为您应该首先按行迭代。
创意#2:仅在nans
上进行迭代,即使用np.isnan(xdis_new)|np.isnan(ydis_new)
索引数组,这可以为您节省一些迭代次数
编辑#1
您可能不需要在循环中初始化d
,weight_fac
和weighted_area
,而是单独计算它们。
您的weight[where(d>0)]
可以在weight[d>0]
您需要weight_fac
吗?你不能只计算weight
然后将其标准化吗?这应该可以节省一些临时数组。
答案 3 :(得分:0)
分析绝对是一个很好的开始,可以确定实际花费的时间。
我通常使用cProfile
模块,因为它需要的开销很小,并且给了我足够多的信息。
import cProfile
import pstats
cProfile.run('main()', "ProfileData.txt", 'tottime')
p = pstats.Stats('ProfileData.txt')
p.sort_stats('cumulative').print_stats(100)
我的示例是您必须将代码包装到main()
函数中,以便能够在文件的最后使用此代码段。
答案 4 :(得分:0)
您特别要求在一个循环中迭代两个数组。这是一种方法
l1 = ["abc", "def", "hi"]
l2 = ["ghi", "jkl", "lst"]
for f,s in zip(l1,l2):
print "%s : %s" %(f,s)
以上是python 3,你可以使用izip for python 2