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

标签 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。我想使用这些列表来确定二维数组中的元素。在确定并存储元素之和后,我想将 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 时,是否可以返回二维数组元素的列表?我尝试了以下方法,但这不起作用:

a[x_list][y_list]

非常感谢!

最佳答案

可以通过执行 a[x, y] 返回 array 元素形成二维数组,其中 x y 都是整数数组。这称为高级索引或有时称为 fancy indexing .在您的问题中,您提到了很多列表,但实际上从未在您的代码中使用任何列表,x_list 和 y_list 都是数组。此外,numpy 多维数组通常索引为 a[i, j],即使 ij 是整数值也是如此。

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

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)

希望对您有所帮助。

关于python - 需要提高速度性能。使用嵌套 for 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20850219/

相关文章:

python - 自动截断 numpy 数组

c - 在 C 中访问二维位数组中特定位的最快方法?

c++ - 从第二个排列开始时极度减速

Android canvas setShadowLayer 大大降低了性能

python - 使用 openshift 的 Flask Dropbox 快速启动示例

python - Pygame 速度和碰撞问题

ruby-on-rails - 如何将 float 转换为 ruby​​ 中的数组?

mysql - JDBC 批量插入性能

Linux "file"命令的 Python 模拟

python - Django 查询集 : All Model1 objects where a Model2 exists with a model1 AND the given user