我有一个二维阵列形状(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]
非常感谢!
答案 0 :(得分:1)
通过执行a[x, y]
,x
和y
都是整数数组,可以从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)
希望有所帮助。