需要提高速度性能。使用嵌套for循环

时间:2013-12-31 01:15:28

标签: python arrays performance for-loop numpy

我有一个二维阵列形状(1002,1004)。对于这个问题,它可以通过以下方式生成:

a = numpy.arange( (1002 * 1004) ).reshape(1002, 1004)

我所做的是生成两个列表。列表通过以下方式生成:

theta = (61/180.) * numpy.pi
x = numpy.arange(a.shape[0])             #(1002, )
y = numpy.arange(a.shape[1])             #(1004, )

max_y_for_angle = int(y[-1] - (x[-1] / numpy.tan(theta)))

第一个清单由:

给出
x_list = numpy.linspace(0, x[-1], len(x))

请注意,此列表与x相同。但是,出于说明目的并给出一个清晰的图片,我宣布了这个'列表'。

我现在要做的是创建一个与x_list一样长的y_list。我想使用这些列表来确定我的2D数组中的元素。在确定并存储元素的总和之后,我想将y_list移动​​一并再次确定元素的总和。我想为max_y_for_angle迭代执行此操作。我的代码是:

sum_list = numpy.zeros(max_y_for_angle)
for idx in range(max_y_for_angle):
    y_list = numpy.linspace((len(x) / numpy.tan(theta)) + idx, y[0] + idx , len(x))
    elements = 0
    for i in range(len(x)):
       elements += a[x_list[i]][y_list[i]]
    sum_list[idx] = elements

此操作有效。然而,正如人们可能想象的那样,由于for循环中的for循环,这需要花费很多时间。 for循环的迭代次数也没有帮助。我怎样才能加快速度?此操作现在需要大约1秒。我正在寻找200毫秒以下的东西。

当输入为x_list和y_list时,是否可以返回2D数组元素的列表?我尝试了以下但是这不起作用:

a[x_list][y_list]

非常感谢!

1 个答案:

答案 0 :(得分:1)

通过执行a[x, y]xy都是整数数组,可以从2d数组返回元素的数组。这称为高级索引,有时称为fancy indexing。在你的问题中,你提到很多,但实际上从未在代码中使用任何列表,x_list和y_list都是数组。此外,即使a[i, j]i为整数值,numpy多维数组通常也会被编入索引j

使用花哨的索引以及一些清理代码产生了这个:

import numpy

def line_sums(a, thata):
    xsize, ysize = a.shape
    tan_theta = numpy.tan(theta)
    max_y_for_angle = int(ysize - 1 - ((xsize - 1) / tan_theta))

    x = numpy.arange(xsize)
    y_base = numpy.linspace(xsize / tan_theta, 0, xsize)
    y_base = y_base.astype(int)
    sum_list = numpy.zeros(max_y_for_angle)

    for idx in range(max_y_for_angle):
        sum_list[idx] = a[x, y_base + idx].sum()

    return sum_list

a = numpy.arange( (1002 * 1004) ).reshape(1002, 1004)
theta = (61/180.) * numpy.pi
sum_list = line_sums(a, theta)

希望有所帮助。