如何在 Python 中就地对整数数组进行排序?
Posted
技术标签:
【中文标题】如何在 Python 中就地对整数数组进行排序?【英文标题】:How to sort an integer array in-place in Python? 【发布时间】:2011-07-29 05:59:23 【问题描述】:如何在 Python 2.6 中对整数数组(不是列表)进行就地排序?标准库中是否有合适的函数?
换句话说,我正在寻找可以执行以下操作的函数:
>>> a = array.array('i', [1, 3, 2])
>>> some_function(a)
>>> a
array('i', [1, 2, 3])
提前致谢!
【问题讨论】:
为什么排除使用列表?你有没有分析并发现它缺乏?如果必须使用数组并且需要对其进行排序,我建议使用 numpy,它具有数组的排序方法。 @Steven 是的,我已经对其进行了分析。我正在研究几乎不适合 RAM 的大量整数。整数列表至少比整数数组大 3 倍,所以我不能使用它们。您(或其他任何人)能否指出 SciPy/NumPy 中的相关函数? 从docs.scipy.org/doc/numpy/reference/routines.sort.html 开始。请注意,默认排序返回一个副本,但ndarray.sort
就地排序。 (我没有使用 SciPy/NumPy 的经验,但我知道它备受推崇且高度优化。)
【参考方案1】:
嗯,你不能用array.array
来做,但你可以用numpy.array
:
In [3]: a = numpy.array([0,1,3,2], dtype=numpy.int)
In [4]: a.sort()
In [5]: a
Out[5]: array([0, 1, 2, 3])
或者你可以直接从array.array
转换,如果你已经有的话:
a = array.array('i', [1, 3, 2])
a = numpy.array(a)
【讨论】:
这似乎是一种就地排序。很好的答案。【参考方案2】:查看array docs,我没有看到排序的方法。我认为以下内容与使用标准函数一样接近,尽管它确实用同名的新对象破坏了旧对象:
import array
a = array.array('i', [1,3,2])
a = array.array('i', sorted(a))
或者,你可以自己写。
从 cmets 获得的额外信息表明您正在最大化内存,这似乎不适用于您的情况; numpy 解决方案是要走的路。不过,我会把它留作参考。
【讨论】:
【参考方案3】:@steven 提到了 numpy。
Copies vs. in-place operation
-----------------------------
Most of the functions in `numpy` return a copy of the array argument
(e.g., `sort`). In-place versions of these functions are often
available as array methods, i.e. ``x = np.array([1,2,3]); x.sort()``.
Exceptions to this rule are documented.
【讨论】:
以上是关于如何在 Python 中就地对整数数组进行排序?的主要内容,如果未能解决你的问题,请参考以下文章