python的文档中提到了扩展索引语法。
slice([start], stop[, step])
当使用扩展索引语法时,也会生成切片对象。例如:a[start:stop:step]
或a[start:stop, i]
。参见itertools.islice()
返回迭代器的替代版本。
a[start:stop:step]
按描述工作。但是第二个呢?它是如何使用的?
python的文档中提到了扩展索引语法。
slice([start], stop[, step])
当使用扩展索引语法时,也会生成切片对象。例如:a[start:stop:step]
或a[start:stop, i]
。参见itertools.islice()
返回迭代器的替代版本。
a[start:stop:step]
按描述工作。但是第二个呢?它是如何使用的?
a[start:stop,i]
调用方法a.__getitem__((slice(start,stop,None), i))
。
这引发了一个TypeError
ifa
是一个列表,但如果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)