在numpy中如何反转数组?

18

Numpy初学者教程建议使用a[ : :-1]来表示一个反转的a。有人能解释一下这是怎么得到的吗?

我理解a[:]意味着对于a的每个元素(在轴axis=0上)。接下来的:应该表示从我的理解中跳过(或周期)的元素数量。


5
请参见https://dev59.com/D3RB5IYBdhLWcg3wyqOo切片表示法 -- 这适用于Python本身,但像一个好的第三方包一样,NumPy遵循所有这些惯例。 - mgilson
2
另请参见https://dev59.com/tW855IYBdhLWcg3wYjSF#4371049,了解有关numpy基本切片如何返回视图而不是原始数组副本的良好解释。 - Cianan Sims
4个回答

21

这不是numpy,而是Python。

在Python中,有用于序列/可迭代对象的切片,其语法如下

seq[start:stop:step] => a slice from start to stop, stepping step each time.

所有参数都是可选的,但必须有一个:,才能让Python将其识别为切片。

对于步长(step)来说,负值也可以用于以相反的顺序复制相同的序列/可迭代对象:

>>> L = range(10)
>>> L[::-1] 
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

而NumPy遵循这种规则,就像任何好的第三方库一样。

>>> a = numpy.array(range(10))
>>> a[::-1]
array([9, 8, 7, 6, 5, 4, 3, 2, 1, 0])

请参阅此链接


11

正如其他人所指出的那样,这是一种Python的切片技术,而NumPy只是跟随其后。希望这有助于解释它的工作原理:

最后一个元素是步长。 1 表示每次移动一个元素,- 反向移动。

空白表示第一个和最后一个元素,除非您使用负步长,在这种情况下,它们表示最后一个和第一个:

In [1]: import numpy as np

In [2]: a = np.arange(5)

In [3]: a
Out[3]: array([0, 1, 2, 3, 4])

In [4]: a[0:5:1]
Out[4]: array([0, 1, 2, 3, 4])

In [5]: a[0:5:-1]
Out[5]: array([], dtype=int64)

In [6]: a[5:0:-1]
Out[6]: array([4, 3, 2, 1])

In [7]: a[::-2]
Out[7]: array([4, 2, 0])

由于从第0个元素向第5个元素倒退,因此第5行给出了一个空数组。
切片不包括“结束点”(最后一个元素),因此在向后移动时,第6行漏掉了0


为什么 a[5:-1:-1] 返回 array([], dtype=int64) 而不是正确的答案 array([4, 3, 2, 1, 0]) - anaik
4
在Python中的索引操作中,负数表示从列表末尾开始计数。因此,a[-1] 表示最后一个元素。因此,a[5:-1:-1] 等同于 a[5:4:-1],所以空列表是正确的答案。要访问列表末尾(无论向哪个方向),可以使用 None 或留空:a[5:None:-1]a[5::-1] - askewchan

5

这不仅适用于numpy,切片a[::-1]等同于slice(None, None, -1),其中第一个参数是起始索引,第二个参数是结束索引,第三个参数是步长。如果起点或终点为None,则与使用序列的开头或结尾具有相同的行为,并且步长-1将以相反的顺序迭代序列。


0

你可以使用reversed Python内置函数:

import numpy as np

bins = np.arange(0.0, 1.1, .1)
for i in reversed(bins):
    print(i)

如何使用索引9、8、7、6、5、4、3、2、1、0反向枚举numpy? - CS QGB

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接