关于python:计算数组偏移量的python方法

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端口。


除了使用defaultdict,此代码看起来很好。列表似乎是更好的数据结构,因为:

  • 你的钥匙是连续的
  • 您正在存储一个列表,其唯一元素是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.

现在要获取数据,可以使用offset_list=output[5]而不是offset_list=d[5][0]


这是一个很长的一行:

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)]


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

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语句类似)。