在Python2.4上,单冒号片操作符:在Numeric矩阵上按预期工作,因为它返回它所使用的维度的所有值。例如,二维矩阵的所有X和/或Y值.
在Python2.6上,单冒号切片操作符在某些情况下似乎有不同的效果:例如,在常规的二维MxN矩阵上,m[:]可能导致作为结果片返回zeros(<some shape tuple>, 'l')。完整的矩阵是人们所期望的--这就是我们使用Python2.4所得到的。
在Python2.6中使用双冒号::或3点... (而不是单个冒号)似乎解决了这个问题,并返回了正确的矩阵切片。
经过一些猜测,我发现当输入0作为停止索引时,可以获得相同的零输出。例如,m[<any index>:0]返回与m[:]相同的“零”输出。在尝试执行m[:]时,是否有任何方法来调试选择了哪些索引?还是在两个Python版本(2.4到2.6)之间发生了一些变化,从而影响了切片操作符的行为?
使用的Numeric版本(24.2)在这两个版本之间是相同的。为什么单冒号切片在Python2.6上的工作方式与2.4版本不同?
Python2.6 2.6:
>>> a = array([[1,2,3],[4,5,6]])
**>>> a[:]
zeros((0, 3), 'l')**
>>> a[::]
array([[1,2,3],[4,5,6]])
>>> a[...]
array([[1,2,3],[4,5,6]])Python2.4:
>>> a = array([[1,2,3],[4,5,6]])
**>>> a[:]
array([[1,2,3],[4,5,6]])**
>>> a[::]
array([[1,2,3],[4,5,6]])
>>> a[...]
array([[1,2,3],[4,5,6]])(我从头到尾输入了“代码”,所以它可能不是完全准确的语法,也不是打印出来的,而是显示了正在发生的事情)
发布于 2016-02-27 22:20:59
我想我10年前用的是2.4。我当时使用了numpy,但可能已经为其NETCDF功能添加了Numeric。但细节是模糊的。而我现在没有这些版本的测试。
那时的Python文档应该很容易浏览。numpy/Numeric文档较少。
我认为Python总是对列表进行基本的:切片。alist[:]用于复制,alist[1:-1]用于切片第一个和最后一个元素,等等。
我不知道什么时候添加了step,例如alist[::-1]来反转列表。
Python开始根据数值开发人员的要求识别索引元组,例如arr[2,4]、arr[(2,4)]、arr[:, [1,2]]、arr[::-1, :]。但我不知道那是什么时候出现的
Ellipsis也主要用于多维索引。Python解释器识别...,但列表不处理它。大约在同一时间,:符号被正式实现为slice。
在3.5中,我们可以用slice反转列表
In [6]: list(range(10)).__getitem__(slice(None,None,-1))
Out[6]: [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]我建议几件事:
numpy (和list)索引/切片https://stackoverflow.com/questions/35663958
复制相似问题