Pythonic way to calculate offsets of an array
我正在尝试计算可变大小数组的原点和偏移量,并将它们存储在字典中。以下是我实现这一目标的可能的非Python式方法。我不确定是否应该使用map、lambda函数或列表理解来使代码更具Python式。
从本质上讲,我需要根据总大小对数组进行切块,并将xStart、ystart、x-number、x-number和y-number存储到字典中。总大小是可变的。我不能将整个数组加载到内存中并使用numpy索引,否则我肯定会这样做。原点和偏移量用于使数组变为numpy。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | intervalx = xsize / xsegment #Get the size of the chunks intervaly = ysize / ysegment #Get the size of the chunks #Setup to segment the image storing the start values and key into a dictionary. xstart = 0 ystart = 0 key = 0 d = defaultdict(list) for y in xrange(0, ysize, intervaly): if y + (intervaly * 2) < ysize: numberofrows = intervaly else: numberofrows = ysize - y for x in xrange(0, xsize, intervalx): if x + (intervalx * 2) < xsize: numberofcolumns = intervalx else: numberofcolumns = xsize - x l = [x,y,numberofcolumns, numberofrows] d[key].append(l) key += 1 return d |
我知道xrange不适合3端口。
除了使用
- 你的钥匙是连续的
- 您正在存储一个列表,其唯一元素是dict中的另一个列表。
你可以做的一件事是:
- 使用三元运算符(我不确定这是否是一个改进,但代码行数会更少)
这里是您的代码的修改版本,我有一些建议。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | intervalx = xsize / xsegment #Get the size of the chunks intervaly = ysize / ysegment #Get the size of the chunks #Setup to segment the image storing the start values and key into a dictionary. xstart = 0 ystart = 0 output = [] for y in xrange(0, ysize, intervaly): numberofrows = intervaly if y + (intervaly * 2) < ysize else ysize -y for x in xrange(0, xsize, intervalx): numberofcolumns = intervalx if x + (intervalx * 2) < xsize else xsize -x lst = [x, y, numberofcolumns, numberofrows] output.append(lst) #If it doesn't make any difference to your program, the above 2 lines could read: #tple = (x, y, numberofcolumns, numberofrows) #output.append(tple) #This will be slightly more efficient #(tuple creation is faster than list creation) #and less memory hungry. In other words, if it doesn't need to be a list due #to other constraints (e.g. you append to it later), you should make it a tuple. |
现在要获取数据,可以使用
这是一个很长的一行:
1 2 | d = [(x,y,min(x+xinterval,xsize)-x,min(y+yinterval,ysize)-y) for x in xrange(0,xsize,xinterval) for y in xrange(0,ysize,yinterval)] |
您是否考虑使用
http://docs.scipy.org/doc/numpy/reference/generated/numpy.memmap.html网站
虽然它不会改变您的算法,但编写if/else语句的一种更为Python式的方法是:
1 | numberofrows = intervaly if y + intervaly * 2 < ysize else ysize - y |
而不是这个:
1 2 3 4 | if y + (intervaly * 2) < ysize: numberofrows = intervaly else: numberofrows = ysize - y |
(与其他if/else语句类似)。