Динамическая нарезка списка - PullRequest
0 голосов
/ 20 августа 2009

Добрый день код рыцарей,

У меня есть хитрая проблема, для которой я не вижу простого решения. И история человечества утверждает, что есть простое решение для всего (кроме покупки подарков)

Вот проблема:

Мне нужен алгоритм, который принимает многомерные списки и словарь фильтров, обрабатывает их и возвращает списки на основе фильтров.

Например:

Bathymetry ('x', 'y')=(182, 149) #notation for (dimensions)=(size)
Chl  ('time', 'z', 'y', 'x')=(4, 31, 149, 182) 
filters {'x':(0,20), 'y':(3), 'z':(1,2), time:()} #no filter stands for all values

Вернется:

readFrom.variables['Bathymetry'][0:21, 3]    
readFrom.variables['Chl'][:, 1:3, 3, 0:21]

Я думал о цикле for для измерений, читая фильтры из списка фильтров, но я не могу понять, как на самом деле передать атрибуты нарезной машине.

Любая помощь высоко ценится.

Ответы [ 2 ]

3 голосов
/ 20 августа 2009

Я не уверен, что понял ваш вопрос. Но я думаю, что slice объект - это то, что вы ищете:

Сначала вместо пустого кортежа используйте None, чтобы включить все значения во времени

filters=  {'x':(0,20), 'y':(3), 'z':(1,2), 'time':None}

Затем создайте словарь срезов следующим образом:

d = dict(
        (k, slice(*v) if isinstance(v, tuple) else slice(v))
        for k, v in filters.iteritems()
    )

Вот вывод:

{
    'y': slice(None, 3, None),
    'x': slice(0, 20, None),
    'z': slice(1, 2, None),
    'time': slice(None, None, None)
}

Затем вы можете использовать объекты срезов, чтобы извлечь диапазон из списка

2 голосов
/ 20 августа 2009

Должно работать что-то вроде следующего:

def doit(nam, filters):
    alldims = []
    for dimname in getDimNames(nam):
      filt = filters.get(dimname, ())
      howmany = len(filt)
      if howmany == 0:
        sliciflt = slice()
      elif howmany == 1:
        sliciflt = filt[0]
      elif howmany in (2, 3):
        sliciflt = slice(*filt)
      else:
        raise RuntimeError("%d items in slice for dim %r (%r)!"
                           % (howmany, dimname, nam))
      alldims.append(sliciflt)


return readFrom.variables[nam][tuple(alldims)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...