6

我正在尝试计算可变大小数组的原点和偏移量并将它们存储在字典中。这是我实现这一目标的可能的非pythonic方式。我不确定是否应该使用 map、lambda 函数或列表推导来使代码更 Pythonic。

本质上,我需要根据总大小切割数组的块并将 xstart、ystart、x_number_of_rows_to_read、y_number_of_columns_to_read 存储在字典中。总大小是可变的。我无法将整个数组加载到内存中并使用 numpy 索引,或者我肯定会。原点和偏移量用于将数组转换为 numpy。

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 来说并不理想。

4

4 回答 4

7

除了您使用defaultdict. 列表似乎是一种更好的数据结构,因为:

  • 您的键是顺序的
  • 您正在存储一个列表,其唯一元素是您的字典中的另一个列表。

你可以做的一件事:

  • 使用三元运算符(我不确定这是否会有所改进,但代码行会更少)

这是您的代码的修改版本,其中包含我的一些建议。

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.

现在要获取您的数据,您可以这样offset_list=output[5]offset_list=d[5][0]

于 2012-07-18T20:46:34.760 回答
0

您是否考虑过使用np.memmap动态加载片段?然后,您只需要即时确定所需的偏移量,而不是对存储偏移量的数组进行分块。

http://docs.scipy.org/doc/numpy/reference/generated/numpy.memmap.html

于 2012-07-18T20:52:51.913 回答
0

尽管它不会改变您的算法,但编写 if/else 语句的更 Pythonic 方式是:

numberofrows = intervaly if y + intervaly * 2 < ysize else ysize - y

而不是这个:

if y + (intervaly * 2) < ysize:
    numberofrows = intervaly
else:
    numberofrows = ysize - y

(对于其他 if/else 语句也是如此)。

于 2012-07-18T20:51:02.130 回答
0

这是一个很长的班轮:

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)]
于 2012-07-18T21:03:21.030 回答