您能帮我理解一下这两次排序尝试的输出吗?
尝试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
,这是你正在打印的,你会看到一个排序的视图版本,而不是基。