我有一个形状为 (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]
,即使 i
和 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)
希望对您有所帮助。
关于python - 需要提高速度性能。使用嵌套 for 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20850219/