8

python的文档中提到了扩展索引语法。

slice([start], stop[, step])

当使用扩展索引语法时,也会生成切片对象。例如:a[start:stop:step]a[start:stop, i]。参见itertools.islice()返回迭代器的替代版本。

a[start:stop:step]按描述工作。但是第二个呢?它是如何使用的?

4

2 回答 2

12

a[start:stop,i]调用方法a.__getitem__((slice(start,stop,None), i))

这引发了一个TypeErrorifa是一个列表,但如果a是一个 numpy 数组,它是有效且有用的表示法。事实上,我相信 Numpy 的开发人员要求 Python 的开发人员精确地扩展有效的 Python 切片表示法,以便可以更轻松地实现 numpy 数组切片表示法。

例如,

import numpy as np
arr=np.arange(12).reshape(4,3)
print(arr)
# [[ 0  1  2]
#  [ 3  4  5]
#  [ 6  7  8]
#  [ 9 10 11]]

1:3选择第 1 行和第 2 行,然后2 选择第三列:

print(arr[1:3,2])
# [5 8]

PS。要试验将哪个切片发送到__getitem__,您可以使用这个玩具代码:

class Foo(list):
    def __getitem__(self,key):
        return repr(key)

foo=Foo(range(10))
print(foo[1:5,1,2])
# (slice(1, 5, None), 1, 2)
于 2010-05-03T20:47:55.700 回答
4

该表示法[:,:]用于对多维数组进行切片。默认情况下,Python 没有任何多维数组,但语法支持它,例如numpy就利用了这种语法。

于 2010-05-03T20:34:32.967 回答