在python中减少长forloop的时间

2024-09-28 03:20:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我这边还有一个愚蠢的问题;)我对以下len(x)=len(y)=7'700'000的片段有一些问题:

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])

除了arrgrid,所有变量都是浮点或整数。arr是1D数组,grid是2D数组。在

我的问题是运行循环需要很长时间(几分钟)。有谁能解释一下,为什么要花这么长时间?有什么建议吗?即使我试图通过range()arange()进行交换,我也只节省了一些时间。在

谢谢。在

第一次编辑 对不起的。忘记告诉我正在导入numpy

第二次编辑

我在二维网格中有一些点。网格的每个单元格都存储了一个值。我必须找出该点的位置,并将该值应用于新数组。这是我的问题和想法。在

附言:如果你想更好地理解它,请看这幅画。单元格的值用不同的颜色表示。在

idea


Tags: fromnumpy网格编辑lenifrange数组
3条回答

比如说:

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列表那样对待数组。在

除了数据的大小,我看不出明显的问题。你的电脑能把所有的东西都记在记忆里吗?如果不是,那么您可能是在交换内存中“跳跃”,这将始终是缓慢的。如果完整的数据在内存中,请尝试psyco。这可能会大大加快你的计算速度。在

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

如果你不想生成一个巨大的额外列表,还有izip。在

相关问题 更多 >

    热门问题