【问题标题】:Use Numpy Multidimensional Array Slicing Without Using the [slice,slice] Syntax?使用 Numpy 多维数组切片而不使用 [slice,slice] 语法?
【发布时间】:2014-04-27 12:17:53
【问题描述】:

有没有不使用 [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]])

【问题讨论】:

  • 能否请您澄清一下您想要达到的目标,到目前为止您已经尝试过的内容以及它究竟是如何失败的?什么是异常函数调用?
  • [bla, blah] 只是[(blah, blah)] 我敢打赌关于这个有很多问题......
  • 我已编辑问题以进一步澄清。如果仍不清楚,请告诉我。
  • 这个问题可能更适合 numpy github,但我很惊讶以前没有遇到过这个问题,并认为最好在像 stackoverflow 这样的更公开的论坛中完成,以防万一将来有人需要澄清
  • 听起来您想要arr.__getitem__(tuple_of_slice_objects)__setitem__ 进行分配。 (顺便说一句,您的修改有助于使问题更加清晰。我认为这是一个很好的问题。)

标签: python arrays numpy multidimensional-array


【解决方案1】:

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

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)

【讨论】:

  • 太棒了!这出乎意料的简单,非常感谢!我将编辑我的问题以总结此解决方案在 numpy 中的使用
  • 很好地解释了切片如何在底层工作以及切片对象是如何表示的。
【解决方案2】:

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

def do_slice(sl, mystring):
    return mystring[sl]

sl = slice(0,2)
mystr = "Hello"

print do_slice(sl, mystr)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-15
    • 1970-01-01
    • 2014-06-09
    • 2021-11-23
    • 2019-01-07
    • 2017-04-11
    相关资源
    最近更新 更多