因此具有这样的矩阵:
[[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.]]
答案 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)