6

可変サイズの配列の原点とオフセットを計算して、辞書に保存しようとしています。これが私がこれを達成している可能性が高い非pythonicな方法です。コードをより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。リストは、次の理由ではるかに優れたデータ構造のように見えます。

  • キーはシーケンシャルです
  • dict内の別のリストのみが要素であるリストを保存しています。

あなたができることの1つ:

  • 三項演算子を使用します(これが改善されるかどうかはわかりませんが、コードの行数が少なくなります)

これが私のいくつかの提案を含むあなたのコードの修正版です。

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

アルゴリズムは変更されませんが、if/elseステートメントを記述するためのよりPython的な方法は次のとおりです。

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

np.memmap代わりに、ピースを動的にロードするために使用することを検討しましたか?次に、オフセットを格納する配列をチャンク化するのではなく、その場で必要なオフセットを決定する必要があります。

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

于 2012-07-18T20:52:51.913 に答える
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 に答える