NumPy就地排序如何在视图上工作?



您能帮我理解一下这两次排序尝试的输出吗?

尝试1

import numpy as np
a = np.array([1, 2, 3])
a[::-1].sort()
print(a)
# prints [3 2 1]

我莫名其妙地理解a[::-1]是一个视图,因此就地排序导致降序而不是通常的升序。

尝试2

import numpy as np
a = np.array([1, 2, 3])
a = a[::-1]
a.sort()
print(a)
# prints [1 2 3]

这里有什么变化?我们仍然在视图上操作,那么为什么输出不同呢?

让我们避免"返回赋值"的复杂性,并使用一个新的变量名:

In [75]: x=np.array([1,2,3]); x1 = x[::-1]    
In [76]: x1, x1.base
Out[76]: (array([3, 2, 1]), array([1, 2, 3]))
In [77]: x1.sort()
In [78]: x1, x1.base
Out[78]: (array([1, 2, 3]), array([3, 2, 1]))

所以x1已经被就地排序了,在这个过程中改变了碱(仍然是x)。

在一行中,x以相同的方式变化:

In [79]: x=np.array([1,2,3]); x[::-1].sort()
In [80]: x
Out[80]: array([3, 2, 1])

两种情况都是一样的。它只是被a=a[::-1]步骤掩盖了。

有趣的问题。请看这里:

>>> a = np.array([1, 2, 3])
>>> a = a[::-1]
>>> a
array([3, 2, 1])
>>> a.base
array([1, 2, 3])
>>> a.sort()
>>> a
array([1, 2, 3])
>>> a.base
array([3, 2, 1])

在你的尝试2中,基数组实际上是按相反的顺序排序的,但是因为你重新分配回a,这是你正在打印的,你会看到一个排序的视图版本,而不是基。

最新更新