gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 18:45:28 24 4
gpt4 key购买 nike

我有一个形状为 (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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com