【发布时间】:2021-10-31 20:08:25
【问题描述】:
我有一个从二维数组生成的列表,如下所示
a = [[4,3],[4,5]]
列表a中的每一项都是从二维数组感兴趣的坐标中收集的行、列
我想对这个列表 a 进行排序,这样我就可以获得字典上最小的行,在这种情况下是 [4,3] 的列
我试过了
np.lexsort([[4,3],[4,5]])
但它无法理解输出。
【问题讨论】:
标签: python numpy sorting lexicographic
我有一个从二维数组生成的列表,如下所示
a = [[4,3],[4,5]]
列表a中的每一项都是从二维数组感兴趣的坐标中收集的行、列
我想对这个列表 a 进行排序,这样我就可以获得字典上最小的行,在这种情况下是 [4,3] 的列
我试过了
np.lexsort([[4,3],[4,5]])
但它无法理解输出。
【问题讨论】:
标签: python numpy sorting lexicographic
np.lexsort 使用最后一个元素作为主键,因此在您的示例中它首先对 3 和 5 进行排序。如果您想使用第一个元素作为键,您可以执行以下操作:
import numpy as np
a = np.array([[4,3],[4,5],[5,2],[5,6]])
print(np.lexsort(np.fliplr(a).T))
输出:
[0 1 2 3]
输出表明第一个元素[4,3] 是最小的,因此该元素的值是0。
【讨论】:
你说 “我想对这个列表 a 进行排序,这样我就可以得到字典上最小的行,在这种情况下是 [4,3] 的列”。但是,如果您感兴趣的只是获取列表中的最小元素,那么您就不需要对它进行排序。你可以使用builtin function min。
在python中排序和取最小值都默认使用字典顺序,所以你可以直接调用min:
a = [[4,3],[4,5]]
min_row = min(a)
print(min_row)
# [4, 3]
如果您想按字典顺序获取 min 列,则需要转置列表列表,以便内部列表与列相对应。请参阅此相关问题:Transpose list of lists 和 the documentation on zip
a = [[4,3],[4,5]]
min_col = min(zip(*a))
print(min_col)
# (3, 5)
如果你真的想排序而不是取最小元素,那么你可以使用.sort() 或sorted( ) 而不是min( )。
a = [[4,3],[4,5]]
# sorting a copy
sorted_rows = sorted(a)
print(sorted_rows)
# sorting in-place
a.sort()
print(a)
【讨论】:
n 行的表中寻找k 最小的行,使用k numpy.argpartition 或heapq.nlargest 而不是排序