将语法切片为对象

时间:2013-03-01 16:03:41

标签: python numpy slice

我有一个包含数据的类(一个numpy ndarray),其中包含一个将数据存储到mat文件的方法(使用scipy.io.savemat)。数据可能非常大,因此我可能只想存储一段数据。因此,我传递一个切片对象,如下所示:

def write_mat(self, fn, fields=None, sel=None):
    # (set fields and sel to sensible values if None)
    scipy.io.savemat(fn, dict(data=self.data[fields][sel]))

此处,fields可以是字符串列表(self.data是结构化数组),sel是切片对象。当然,我不能直接将切片语法传递给write_matobj.write_mat(fn, fields, [::10])是一个SyntaxError。当然,我可以传递slice(None, None, 10),但我不太喜欢这个解决方案。

是否有任何内置的便利对象可以让我从切片语法创建切片对象?当然,它很容易实现:

In [574]: class Foo:
     ...:     def __getitem__(self, item):
     ...:         return item
     ...:     

In [578]: slicer = Foo()

In [579]: slicer[::100]
Out[579]: slice(None, None, 100)

但即使是易于实施的东西,也许已经有了更标准的解决方案。在那儿?按标准来说,我的意思是存在于Python,numpy或scipy中。

1 个答案:

答案 0 :(得分:3)

Passing Python slice syntax around to functions上的答案是正确的,但由于您已经在使用NumPy,因此您可以使用np.s_

import numpy as np
np.s_[1:2:3]
Out[1]: slice(1, 2, 3)