【问题标题】:Dynamic list slicing动态列表切片
【发布时间】:2010-11-21 09:03:25
【问题描述】:

密码骑士们好,

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

问题来了:

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

例如:

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 循环,从过滤器列表中读取过滤器,但我无法真正将属性传递给切片机。

非常感谢任何帮助。

【问题讨论】:

  • 对不起,我不知道你在做什么,也不知道你想做什么。你能再解释一下吗?
  • 陷入了沉思。为简单起见进行了编辑。
  • 我结婚了,我的妻子现在买了大部分礼物。
  • @Pete,听起来像个黑客,确实是一个解决方案。

标签: python algorithm list multidimensional-array


【解决方案1】:

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

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

【讨论】:

  • 谢谢!太糟糕了,我不能接受比我回答的更多。你的非常优雅,而 Martellis 更容易理解。作为一个新手,我会选择更简单的。
【解决方案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)]

【讨论】:

  • 啊啊,所以有切片对象这样的东西。正是我需要的,非常感谢。
猜你喜欢
  • 2016-02-16
  • 1970-01-01
  • 2010-12-14
  • 1970-01-01
  • 2015-07-25
  • 1970-01-01
  • 2017-06-24
  • 2015-02-19
  • 2014-05-13
相关资源
最近更新 更多