我正在试图弄清楚为什么这段代码不对数组进行排序......
x = array([[3, 2, 4, 5, 7, 4, 3, 4, 3, 3, 1, 4, 6, 3, 2, 4, 3, 2]])
xCoo = sps.coo_matrix(x)
perm = np.argsort(x)
xCoo.col = perm[xCoo.col]
print(xCoo.toarray()) # array([3, 2, 4, 5, 7, 4, 3, 4, 3, 3, 1, 4, 6, 3, 2, 4, 3, 2])
我不确定我误解了什么。这样做的正确方法是什么?
谢谢。
P.S。我知道我可以在数组上调用sort;但是,我一遍又一遍地使用相同的排列。
答案 0 :(得分:2)
第一个复杂因素是np.argsort(x)
返回一个二维数组。让我们对展平x
进行排序,以获得更简单的1d perm
:
In [1118]: perm=np.argsort(x,None)
In [1119]: perm
Out[1119]:
array([10, 17, 1, 14, 13, 9, 16, 0, 6, 8, 5, 11, 2, 15, 7, 3, 12,
4], dtype=int32)
按照我们的预期排序x
,对吧?
In [1120]: x[:,perm]
Out[1120]: array([[1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 6, 7]])
现在以与xCoo
相同的方式应用它,但我们必须将其转换为lil
格式。 coo
格式不可订阅:
In [1121]: xCoo.tolil()[:,perm].A
Out[1121]: array([[1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 6, 7]], dtype=int32)
要将perm
直接应用于xCoo
的属性,我们需要进行另一种排序:
xCoo.col = np.argsort(perm)[xCoo.col] # <====
这适用于带有零的多行xCoo
。
您还可以对数据进行排序:
xCoo.data = xCoo.data[perm[xCoo.col]]
这些工作在这里,但他们需要更多的测试。