动态列表切片

时间:2009-08-20 15:34:45

标签: python algorithm list multidimensional-array

美好的代码骑士,

我有一个棘手的问题,我看不到一个简单的解决方案。而人类的历史表明,对所有事物都有一个简单的解决方案(不包括购买礼物)

问题在于:

我需要一种算法,它采用多维列表和过滤字典,处理它们并根据过滤器返回列表。

例如:

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 个答案:

答案 0 :(得分:3)

我不确定我理解你的问题。但我认为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)
}

然后您可以使用切片对象从列表中提取范围

答案 1 :(得分:2)

以下内容应该有效:

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