使用Numpy多维数组切片而不使用[slice,slice]语法



是否有一种方法可以使用Numpy的多维数组切片而不使用[slice, slice]语法?

我需要能够使用它从正常的函数调用,但我还没有找到一种方法来使用切片对象来做到这一点。

我不能在我的程序中使用语法[(slice,slice)],因为[]是常规函数调用之外的特殊语法。我使用的语言是Hy,一种Python的Lisp语言,它不支持这种语法。更重要的是,它不应该支持这种语法。然而,Numpy似乎不支持多维切片而不使用[]语法。

让我困惑的是,Numpy源代码中C和Python的混合使得很难辨别[slice,slice]是如何实现的。甚至可能无法绕过此语法。

编辑:

下面由@Joe Kington提供的答案允许人们像这样切片Numpy矩阵:

x = np.array([list(range(5)) for x in list(range(5))]) x.getitem(slice(1,4)) array([[0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4]]) x.getitem(tuple([slice(1,4),slice(1,4)])) array([[1, 2, 3], [1, 2, 3], [1, 2, 3]])

从你的描述来看,你似乎在问什么函数调用是用来实现切片和切片分配的。

Python使用"特殊"方法__getitem____setitem__来实现和/或允许自定义切片的工作方式。任何实现这些的类都可以被分割。这其实没什么特别的。

换句话说

x = arr[4:10, 9:15, ::-1]
x[0] = 100

译为

x = arr.__getitem__((slice(4, 6), slice(9, 10), slice(None, None, -1)))
x.__setitem__(0, 100)
例如:

class Foo(object):
    def __getitem__(self, index):
        print 'Getting', index
    def __setitem__(self, index, val):
        print 'Setting', index, 'to', val
f = Foo()
print 'Getting...'
f[:]
f[4:10, ::-1, ...]
print 'Equivalently:'
f.__getitem__(slice(None))
f.__getitem__((slice(4, 10), slice(None, None, -1), Ellipsis))
print 'Setting...'
f[0] = 1
f[5:10, 100] = 2
f[...] = 100
print 'Equivalently:'
f.__setitem__(0, 1)
f.__setitem__((slice(5,10), 100), 2)
f.__setitem__(Ellipsis, 100)

同样,了解numpy.index_exp(或等价的np.s_)也很方便。这没什么特别的——它只是将切片转换成等价的元组,等等。它与上面的Foo类非常相似。例如:

In [1]: np.index_exp[10:4, ::-1, ...]
Out[1]: (slice(10, 4, None), slice(None, None, -1), Ellipsis)

我怀疑您正在试图将切片作为参数传递?

def do_slice(sl, mystring):
    return mystring[sl]
sl = slice(0,2)
mystr = "Hello"
print do_slice(sl, mystr)

相关内容

  • 没有找到相关文章

最新更新