幫助我更快地編寫代碼:我的python代碼需要生成位於邊界矩形內的點的二維點陣。我將一些代碼(如下所示)彙集在一起生成此格。然而,這個函數被多次調用,並且已經成爲我應用程序中的一個嚴重瓶頸。高效地生成python中點的點陣
我相信有一個更快的方法來做到這一點,可能涉及numpy數組而不是列表。任何建議更快,更優雅的方式來做到這一點?
功能描述: 我有兩個2D矢量,v1和v2。這些載體define a lattice。就我而言,我的矢量定義了一個幾乎但不完全是六角形的格子。我想生成一些邊界矩形中的這個點陣上的所有二維點的集合。在我的情況下,矩形的其中一個角位於(0,0),其他角位於正座標。
例: 如果我的邊框遠角是在(3,3),和我的格子載體分別是:
v1 = (1.2, 0.1)
v2 = (0.2, 1.1)
我希望我的函數返回點:
(1.2, 0.1) #v1
(2.4, 0.2) #2*v1
(0.2, 1.1) #v2
(0.4, 2.2) #2*v2
(1.4, 1.2) #v1 + v2
(2.6, 1.3) #2*v1 + v2
(1.6, 2.3) #v1 + 2*v2
(2.8, 2.4) #2*v1 + 2*v2
我不關心邊緣情況;例如,函數是否返回(0,0)並不重要。
較慢的方式目前我正在做:
import numpy, pylab
def generate_lattice(#Help me speed up this function, please!
image_shape, lattice_vectors, center_pix='image', edge_buffer=2):
##Preprocessing. Not much of a bottleneck:
if center_pix == 'image':
center_pix = numpy.array(image_shape) // 2
else: ##Express the center pixel in terms of the lattice vectors
center_pix = numpy.array(center_pix) - (numpy.array(image_shape) // 2)
lattice_components = numpy.linalg.solve(
numpy.vstack(lattice_vectors[:2]).T,
center_pix)
lattice_components -= lattice_components // 1
center_pix = (lattice_vectors[0] * lattice_components[0] +
lattice_vectors[1] * lattice_components[1] +
numpy.array(image_shape)//2)
num_vectors = int(##Estimate how many lattice points we need
max(image_shape)/numpy.sqrt(lattice_vectors[0]**2).sum())
lattice_points = []
lower_bounds = numpy.array((edge_buffer, edge_buffer))
upper_bounds = numpy.array(image_shape) - edge_buffer
##SLOW LOOP HERE. 'num_vectors' is often quite large.
for i in range(-num_vectors, num_vectors):
for j in range(-num_vectors, num_vectors):
lp = i * lattice_vectors[0] + j * lattice_vectors[1] + center_pix
if all(lower_bounds < lp) and all(lp < upper_bounds):
lattice_points.append(lp)
return lattice_points
##Test the function and display the output.
##No optimization needed past this point.
lattice_vectors = [
numpy.array([-40., -1.]),
numpy.array([ 18., -37.])]
image_shape = (1000, 1000)
spots = generate_lattice(image_shape, lattice_vectors)
fig=pylab.figure()
pylab.plot([p[1] for p in spots], [p[0] for p in spots], '.')
pylab.axis('equal')
fig.show()
難道是更好地爲您做'lattice_components = numpy.modf(lattice_components)[0]'? (不問你的問題,但出於好奇,它會明顯更快/更慢?) – JAB 2011-05-26 17:02:48
不知道modf,好建議。我認爲在這個函數中花費的大部分時間都在雙重嵌套for循環中,但我會進行基準測試以確保。 – Andrew 2011-05-26 17:18:10
請寫一個這個函數做什麼的總結。 – 2011-05-26 19:39:37