我有一个形状为(N,2)的2D numpy数组,其中包含N个点(x和y坐标)。例如:
array([[3, 2],
[6, 2],
[3, 6],
[3, 4],
[5, 3]])
我想对它进行排序,以使我的点按x坐标排序,然后在x坐标相同的情况下按y排序。因此,上面的数组应如下所示:
array([[3, 2],
[3, 4],
[3, 6],
[5, 3],
[6, 2]])
如果这是正常的Python列表,我将简单地定义一个比较器来执行我想要的操作,但是据我所知,numpy的sort函数不接受用户定义的比较器。有任何想法吗?
编辑:感谢您的想法!我建立了一个具有1000000个随机整数点的快速测试用例,并对可以运行的基准点进行了基准测试(对不起,目前无法升级numpy)。
Mine: 4.078 secs
mtrw: 7.046 secs
unutbu: 0.453 secs
使用lexsort:
import numpy as np
a = np.array([(3, 2), (6, 2), (3, 6), (3, 4), (5, 3)])
ind = np.lexsort((a[:,1],a[:,0]))
a[ind]
# array([[3, 2],
# [3, 4],
# [3, 6],
# [5, 3],
# [6, 2]])
a.ravel()
如果a
为,则返回一个视图C_CONTIGUOUS
。如果是这样的话,@ars的方法(通过使用ravel
代替稍作修改)将flatten
产生一种很好a
的就地 排序方法:
a = np.array([(3, 2), (6, 2), (3, 6), (3, 4), (5, 3)])
dt = [('col1', a.dtype),('col2', a.dtype)]
assert a.flags['C_CONTIGUOUS']
b = a.ravel().view(dt)
b.sort(order=['col1','col2'])
由于b
是一个视图a
,排序b
排序a
,以及:
print(a)
# [[3 2]
# [3 4]
# [3 6]
# [5 3]
# [6 2]]
问题内容: 请原谅我这是多余的还是超基本的。我要从R进入Python / Numpy,并且很难在脑海里翻转事物。 我有一个维数组,我想使用索引值的另一个n维数组进行排序。我知道我可以将其包装成一个循环,但是似乎应该有一种非常简洁的Numpyonic方式将其击败并提交。这是设置n = 2的问题的示例代码: 所以现在我有一个2 x 5的随机数数组和2 x 5的索引。我已经阅读了约10次帮助,但显然我的
问题内容: 我有这个数组 现在,我想按此方法对数组进行排序 ? 目前,我在一个foreach循环中对此进行排序 必须有更好的方法 编辑 我希望输出类似 谢谢 问题答案: 您可以使用usort函数。
问题内容: 我有一个数组: …我想按钥匙排序 我目前这样打印: 我该怎么做呢? 问题答案: 您将使用usort()-http: //php.net/usort 我的建议是:
问题内容: 有没有一种方法可以使用sort()方法或任何其他方法按列对列表进行排序?可以说我有清单: 我想对其进行排序,使其看起来像这样: 这样做的最佳方法是什么? 编辑: 现在,我遇到索引超出范围错误。我有一个二维数组,可以说1000行b 3列。我想根据第三列对其进行排序。这是正确的代码吗? 问题答案: 是。该内置接受的说法: 请注意,将返回一个新列表。如果要就地排序,请使用列表的方法(也可以方
尝试编写一个Python函数:def compare_lengths(x,y,z) 它接受三个数组作为参数,检查它们的长度,并按长度顺序将它们作为三个数组返回。 例如,如果函数接受[1,2,3]、[10,20,30,40]和[65,32,7]作为输入,则希望它返回([1,2,3]、[65,32,7]、[10,20,30,40])或([65,32,7]、[1,2,3]、[10,20,30,40])