有没有办法不使用 [slice, slice] 语法就可以使用 Numpy 的多维数组切片?
我需要能够从正常的函数调用中使用它,但我还没有找到使用 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.<strong>getitem</strong>(slice(1,4))
array([[0, 1, 2, 3, 4],
[0, 1, 2, 3, 4],
[0, 1, 2, 3, 4]])
x.<strong>getitem</strong>(tuple([slice(1,4),slice(1,4)]))
array([[1, 2, 3],
[1, 2, 3],
[1, 2, 3]])
最佳答案
从你的描述来看,你好像在问什么函数调用是用来实现切片和切片赋值的。
Python 使用“特殊”方法 __getitem__
和 __setitem__
来实现和/或允许自定义切片的工作方式。任何实现这些的类都可以被切片。实际上,这与 numpy 无关。
换句话说
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)
关于python - 在不使用 [slice,slice] 语法的情况下使用 Numpy 多维数组切片?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22536601/