2011-04-13 135 views
1

从我身边其他愚蠢的问题;)我有与LEN(x)= LEN(Y)= 7'700'000下面的代码片段一些问题:减少时间久for循环Python中

from numpy import * 

for k in range(len(x)): 
    if x[k] == xmax: 
     xind = -1 
    else: 
     xind = int(floor((x[k]-xmin)/xdelta)) 
    if y[k] == ymax: 
     yind = -1 
    else: 
     yind = int(floor((y[k]-ymin)/ydelta)) 

    arr = append(arr,grid[xind,yind]) 

所有变量都是浮点数或整数,除了arrgridarr是一维数组,而grid是二维数组。

我的问题是,它需要很长时间来运行循环(几分钟)。任何人都可以解释我,为什么需要这么长时间?有没有人有建议?即使我试图通过arange()交换range(),那么我只能节省一些时间。

谢谢。

1st EDIT 对不起。忘了告诉我进口numpy

第二编辑

我有一个2D网格的几个问题。网格的每个单元格都存储了一个值。我必须找出该点具有哪个位置并将该值应用于新阵列。这是我的问题和我的想法。

如果你想更好地理解它,请看图片。单元格的值用不同的颜色表示。

idea

+1

什么是'append'? – delnan 2011-04-13 20:19:15

+0

你的意思是'xrange'? – 2011-04-13 20:20:05

回答

4

如何像:

import numpy as np 
xind = np.floor((x-xmin)/xdelta).astype(int) 
yind = np.floor((y-ymin)/ydelta).astype(int) 

xind[np.argmax(x)] = -1 
yind[np.argmax(y)] = -1 

arr = grid[xind,yind] 

注:如果您使用numpy的,如果你想有效地做事情不要像对待Python列表的数组。

+0

+1,尤其是对于“如果您使用numpy,请不要像列表一样处理数组”!尽管如此,'np.floor((x-xmin)/ xdelta)'相当于'(x - xmin)// xdelta'(并且边缘更快,在这种情况下并不重要)。 – 2011-04-13 21:00:08

+0

谢谢。这真的非常好! – ahelm 2011-04-13 21:09:22

+0

@PateToni:没问题。 Numpy是一个非常强大的软件包,但它涉及的问题思考方式与您使用其他Python数据结构时的方式不同。切换你想要的时间需要一些时间,但是当你掌握它的时候,你会在你的代码中获得巨大的提速,并一次一个元素遍历数组。 – JoshAdel 2011-04-13 21:42:18

1
for x_item, y_item in zip(x, y): 
    # do stuff. 

还有izip因为如果你不希望产生一个巨大的额外列表。

0

我看不出一个明显的问题,除了数据的大小。你的电脑能够把所有东西都放在内存中吗?如果没有,你可能会在交换内存中“跳来跳去”,这总是会很慢。如果完整的数据在内存中,请尝试psyco。它可能会加快你的计算。

-1

x's lenght是700万?我想这就是为什么! 迭代次数7百万次,

可能你应该做另一种循环。 它真的需要循环超过7米?

0

我怀疑问题可能是要存储的结果的方式:

arr = append(arr,grid[xind,yind]) 

The docs for append说,它返回:

arrvalues副本附加 到axis。请注意,append确实不会在原地发生: 已分配和填充。

这意味着您将在每次迭代中释放并分配更大和更大的数组。我建议先分配一个正确大小的数组,然后用每次迭代中的数据填充它。例如:

arr = empty(len(x)) 

for k in range(len(x)): 
    ... 
    arr[k] = grid[xind,yind]