如何按一行对矩阵排序-Python

时间:2019-01-31 20:42:12

标签: python python-3.x numpy

因此具有这样的矩阵:

[[0. 1. 0. 0. 0.]
[1. 0. 0. 0. 0.]
[0. 0. 0. 1. 0.]
[0. 0. 0. 0. 1.]
[1. 0. 3. 4. 4.]]

如何按最后一行进行排序,以使各列​​的内容保持不变,如下所示:

[[1. 0. 0. 0. 0.]
[0. 1. 0. 0. 0.]
[0. 0. 0. 1. 0.]
[0. 0. 0. 0. 1.]
[0. 1. 3. 4. 4.]]

现在我正在这样做:

num_seq = 10
seq_len = 5
seq_width = 5

con = np.random.randint(0, seq_width,size=seq_len)

seq = np.zeros((seq_len, seq_width))

seq[np.arange(seq_len), con] = 1
seq[seq_len-1, np.arange(seq_width)] = con

out = np.sort(seq, axis=1)

并获得如下所示的输出:

[[0. 0. 0. 0. 1.]
 [0. 0. 0. 0. 1.]
 [0. 0. 0. 0. 1.]
 [0. 0. 0. 0. 1.]
 [0. 1. 3. 4. 4.]]

4 个答案:

答案 0 :(得分:1)

您可以使用np.argsort()和一些numpy切片来做到这一点。使用示例数组:

arr = np.array([[0, 1, 0, 0, 0],
                [1, 0, 0, 0, 0],
                [0, 0, 0, 1, 0],
                [0, 0, 0, 0, 1],
                [1, 0, 3, 4, 4]])
arr[:, np.argsort(arr[-1, :])]
# array([[1, 0, 0, 0, 0],
#        [0, 1, 0, 0, 0],
#        [0, 0, 0, 1, 0],
#        [0, 0, 0, 0, 1],
#        [0, 1, 3, 4, 4]])

基本上,np.argsort(arr[-1, :])按照最后一行的 content 的升序返回arr最后一行的 indices 。对于您给的示例,此操作返回array([1, 0, 2, 3, 4])

然后,我们只用arr[:, np.argsort(arr[-1, :])]抓取所有具有该列的行。

答案 1 :(得分:0)

尝试: arr[:, arr[-1, :].argsort()]

答案 2 :(得分:0)

这符合您的要求,尽管我认为麻木的方法越来越好。这取决于您的矩阵是真正的矩阵,还是数组或列表列表。如果您出于某种原因不能使用numpy,那么即使有点棘手,此解决方案也应该可以独立运行。

ISTDMNet <- st_read(paste(getwd(),"/Input/2015_loaded_Sample.shp", sep = ""))

output$map <- renderLeaflet({
    my_map <- leaflet() %>% addTiles() %>% setView(lat = 39.764075, lng = -86.159019, zoom = 10)  
    my_map <- addPolylines(my_map, data = ISTDMNet, smoothFactor = 1, opacity = 1,
               label = as.character(ISTDMNet$ID),
               color = "gray", layerId = ISTDMNet$ID, weight = 3
  )
my_map
})

答案 3 :(得分:0)

使用argsort选择con作为索引:

import numpy as np

num_seq = 10
seq_len = 5
seq_width = 5

con = np.random.randint(0, seq_width,size=seq_len)

seq = np.zeros((seq_len, seq_width))

seq[np.arange(seq_len), con] = 1
seq[seq_len-1, np.arange(seq_width)] = con


i = np.argsort(con)
seq = seq[:,i]

print(con)
print(seq)