【发布时间】:2014-01-17 23:15:25
【问题描述】:
我有一个形状为 (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 移动 1 并再次确定元素的总和。我想为 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]
非常感谢!
【问题讨论】:
-
只有我一个人,还是
x和y完全没用? -
我同意我可以将 1002 和 1004 用于我的目的。但是,由于创建
x和y几乎不需要任何时间,我确实创建它们以获得更清晰的画面。至少对我自己而言 -
也让代码更通用。如果二维数组的形状发生变化,它仍然可以工作
-
除了...您可以直接使用数组的形状。无需为此制作额外的数组。
标签: python arrays performance for-loop numpy