美好的代码骑士,
我有一个棘手的问题,我看不到一个简单的解决方案。而人类的历史表明,对所有事物都有一个简单的解决方案(不包括购买礼物)
问题在于:
我需要一种算法,它采用多维列表和过滤字典,处理它们并根据过滤器返回列表。
例如:
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循环,从过滤器列表中读取过滤器,但我无法理解将属性传递给切片机。
任何帮助都非常感激。
答案 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)]