Python 是否在不使用[slice,slice]语法的情况下使用Numpy多维数组切片?
有没有一种方法可以在不使用[slice,slice]语法的情况下使用Numpy的多维数组切片 我需要能够从普通函数调用中使用它,但我还没有找到一种使用slice对象的方法 我不能对我的程序使用语法Python 是否在不使用[slice,slice]语法的情况下使用Numpy多维数组切片?,python,arrays,numpy,multidimensional-array,Python,Arrays,Numpy,Multidimensional Array,有没有一种方法可以在不使用[slice,slice]语法的情况下使用Numpy的多维数组切片 我需要能够从普通函数调用中使用它,但我还没有找到一种使用slice对象的方法 我不能对我的程序使用语法[(slice,slice)],因为[]是常规函数调用之外的特殊语法。 我使用的语言是Hy,一种用于Python的Lisp,它不支持这种语法。更重要的是,它不应该支持这种语法。但是,如果不使用[]语法,Numpy似乎不支持多维切片 让我大吃一惊的是,Numpy源代码中C和Python的混合使得很难辨别[
[(slice,slice)]
,因为[]
是常规函数调用之外的特殊语法。
我使用的语言是Hy,一种用于Python的Lisp,它不支持这种语法。更重要的是,它不应该支持这种语法。但是,如果不使用[]
语法,Numpy似乎不支持多维切片
让我大吃一惊的是,Numpy源代码中C和Python的混合使得很难辨别[slice,slice]
是如何实现的。
甚至可能无法绕过这种语法
编辑:
下面由@Joe Kington提供的答案允许我们像这样分割Numpy矩阵:
x=np.数组([list(range(5)),用于列表(range(5))中的x)
x、 getitem(切片(1,4))
数组([[0,1,2,3,4],
[0, 1, 2, 3, 4],
[0, 1, 2, 3, 4]])
x、 getitem(元组([切片(1,4),切片(1,4)])
数组([[1,2,3],
[1, 2, 3],
[1, 2, 3]])
我怀疑您试图将切片作为参数传递
def do_slice(sl, mystring):
return mystring[sl]
sl = slice(0,2)
mystr = "Hello"
print do_slice(sl, mystr)
从您的描述来看,您似乎在问什么函数调用用于实现切片和切片分配 Python使用“特殊”方法
\uuu getitem\uuuuuuuuuuuu
和\uuuuuuu setitem\uuuuuuuuuu
来实现和/或允许定制切片的工作方式。任何实现这些的类都可以被切片。其实这件事没有什么特别的
换句话说
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)
In [1]: np.index_exp[10:4, ::-1, ...]
Out[1]: (slice(10, 4, None), slice(None, None, -1), Ellipsis)
此外,了解numpy.index\u exp
(或者相当于np.s
)也很方便。这没什么特别的——它只是将切片转换成等价的元组,等等。它与上面的Foo
类非常相似。例如:
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)
In [1]: np.index_exp[10:4, ::-1, ...]
Out[1]: (slice(10, 4, None), slice(None, None, -1), Ellipsis)
请你澄清一下你想要达到的目标,到目前为止你尝试了什么,以及失败的原因是什么?什么构成异常函数调用?
[bla,blah]
只是[(blah,blah)]
我打赌这方面有很多问题……我编辑了这个问题以进一步澄清。如果还不清楚,请告诉我。这个问题可能更适合numpy github,但我很惊讶以前从未遇到过,我认为最好是在stackoverflow这样更公开的论坛上解决,以防将来有人需要澄清。听起来你想arr.\u getitem__(tuple_of_slice_objects)
,以及作业的\uuuuuu setitem\uuuuu
。(顺便说一句,您的编辑使问题更加清晰。我认为这是一个好问题。)太棒了!这出乎意料地简单,非常感谢!我将编辑我的问题,总结一下此解决方案在numpyNice中的使用,解释如何在引擎盖下进行切片以及如何表示切片对象。