我身边另一个愚蠢的问题;)我对以下代码片段有一些问题: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])
除arr
和grid
外,所有变量都是浮点数或整数。 arr
是一维数组,grid
是二维数组。
我的问题是需要很长时间才能完成循环(几分钟)。任何人都可以解释一下,为什么这需要这么长时间?有人有什么建议吗?即使我尝试通过range()
交换arange()
,我也只会节省一些时间。
感谢。
第一次编辑
抱歉。忘了告诉我正在导入numpy
第二次编辑
我在2D网格中有一些要点。网格的每个单元格都存储了一个值。我必须找出该点所具有的位置并将该值应用于新数组。这是我的问题和我的想法。
p.s:如果你想更好地理解它,请看图片。单元格的值用不同的颜色表示。
答案 0 :(得分: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列表。
答案 1 :(得分:1)
for x_item, y_item in zip(x, y):
# do stuff.
如果您不想生成一个巨大的额外列表,还有izip。
答案 2 :(得分:0)
除了数据大小之外,我看不出明显的问题。您的计算机能够将所有内容保存在内存中吗?如果没有,你可能会在交换内存中“跳转”,这总是很慢。如果完整数据在内存中,请尝试psyco。它可能会加速你的计算。
答案 3 :(得分:0)
我怀疑问题可能与您存储结果的方式有关:
arr = append(arr,grid[xind,yind])
The docs for append
说它返回:
附加
arr
的{{1}}副本 到values
。请注意,axis
会这样做 就地不会发生:一个新阵列 分配和填充。
这意味着您将在每次迭代时释放并分配越来越大的数组。我建议在前面分配一个正确大小的数组,然后在每次迭代中用数据填充它。 e.g:
append
答案 4 :(得分:-1)
x的长度是7百万?我想那就是原因! 迭代次数达到7百万次,
可能你应该做出另一种循环。 它真的需要循环超过7米?