在不使用[slice,slice]语法的情况下使用Numpy多维数组切片?

cal*_*ben 5 python arrays numpy multidimensional-array

有没有办法在不使用[slice,slice]语法的情况下使用Numpy的多维数组切片?

我需要能够从普通函数调用中使用它,但我还没有找到一种方法来使用切片对象来完成它.

我不能使用[(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]])

Joe*_*ton 7

根据您的描述,您似乎在询问使用哪些函数调用来实现切片和切片分配.

Python使用"特殊"方法__getitem____setitem__实现和/或允许自定义切片的工作方式.任何实现这些的类都可以切片.实际上没有什么特别针对这个问题.

换一种说法

x = arr[4:10, 9:15, ::-1]
x[0] = 100
Run Code Online (Sandbox Code Playgroud)

被翻译成

x = arr.__getitem__((slice(4, 6), slice(9, 10), slice(None, None, -1)))
x.__setitem__(0, 100)
Run Code Online (Sandbox Code Playgroud)

例如:

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)
Run Code Online (Sandbox Code Playgroud)

此外,了解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)
Run Code Online (Sandbox Code Playgroud)