Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 是否在不使用[slice,slice]语法的情况下使用Numpy多维数组切片?_Python_Arrays_Numpy_Multidimensional Array - Fatal编程技术网

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

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]语法的情况下使用Numpy的多维数组切片

我需要能够从普通函数调用中使用它,但我还没有找到一种使用slice对象的方法

我不能对我的程序使用语法
[(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中的使用,解释如何在引擎盖下进行切片以及如何表示切片对象。