如何在python上垂直重新排列矩阵元素

kcrjzv8t  于 2022-12-02  发布在  Python
关注(0)|答案(3)|浏览(445)

我试图建立一个基本的游戏程序,我需要重新排列一个给定的矩阵,但垂直。在这种情况下,我只有0和1。0是较轻的物体,1是较重的物体。当函数运行时,所有的1应该垂直下降,0也垂直上升。它需要有准确的0和1的数量作为原始矩阵。例如:- 如果我给予下面的矩阵:

[1,0,1,1,0,1,0],
[0,0,0,1,0,0,0],
[1,0,1,1,1,1,1],
[0,1,1,0,1,1,0],
[1,1,0,1,0,0,1]

它应重新安排它以:

[0,0,0,0,0,0,0],
[0,0,0,1,0,0,0],
[1,0,1,1,0,1,0],
[1,1,1,1,1,1,1],
[1,1,1,1,1,1,1]

如有任何帮助或建议,我们将不胜感激。

mec1mxoz

mec1mxoz1#

虽然不如numpy方法那样易读,但如果您想使用列表方法,可以
1.使用zip(*matrix)方法转置矩阵。
1.对结果行(原始矩阵的列)进行排序
1.转回去。
您可以在一行中执行此操作:

[row for row in zip(*[sorted(column) for column in zip(*matrix)])]
oxcyiej7

oxcyiej72#

如果您不想使用numpy(尽管您应该使用),可以执行以下操作:

from collections import Counter

test = [[1,0,1,1,0,1,0],
[0,0,0,1,0,0,0],
[1,0,1,1,1,1,1],
[0,1,1,0,1,1,0],
[1,1,0,1,0,0,1] ]

new_version = [[] for _ in test] # create an empty list to append data to
for count, item in enumerate(test[0]): # go through the length of one of the list of lists for their length # assuming that all lists are of equal length
    frequency = Counter([x[count] for x in test]) # get frequency count for the column
    for count_inside, item_inside in enumerate(test): 
        # to add the values depending on their frequency distribution in the column
        value = 0 if 0 in frequency and count_inside < frequency[0] else 1
        new_version[count_inside].append(value)
    
print(new_version)
9njqaruj

9njqaruj3#

考虑用numpy来表示矩阵,然后用np.sort来做你想做的事情:

np.sort(matrix, axis=0)

相关问题