Python 按另一个矩阵排序在一种情况下有效,但在另一种情况下失败

Python 按另一个矩阵排序在一种情况下有效,但在另一种情况下失败,python,sorting,numpy,valueerror,Python,Sorting,Numpy,Valueerror,我需要根据另一个矩阵中值的降序对矩阵进行排序 例如,在第一步中,我将使用以下矩阵a: 1 0 1 0 1 0 1 0 1 0 0 1 0 1 1 1 0 1 0 0 1 0 1 0 1 1 0 1 0 0 0 1 0 1 1 0 1 0 1 0 然后,对于下面的过程,我需要将矩阵的行作为二进制数,并按照二进制值的降序对它们进行排序 我是这样做的: for i in range(0,num_rows): for j in range(0,num_cols): ro

我需要根据另一个矩阵中值的降序对矩阵进行排序

例如,在第一步中,我将使用以下矩阵
a

1 0 1 0 1
0 1 0 1 0
0 1 0 1 1
1 0 1 0 0
1 0 1 0 1
1 0 1 0 0
0 1 0 1 1
0 1 0 1 0
然后,对于下面的过程,我需要将矩阵的行作为二进制数,并按照二进制值的降序对它们进行排序

我是这样做的:

for i in range(0,num_rows):   
    for j in range(0,num_cols):
        row_val[i] = row_val[i] + A[i][j] * (2 ** (num_cols - 1 - j))
这将获得一个4x1向量
行值
,其值如下:

21
10
11
20
现在,我根据
row\u val
by对矩阵的行进行排序

A = [x for _,x in sorted(zip(row_val,A),reverse=True)]
这非常好,我得到矩阵
A

1 0 1 0 1
0 1 0 1 0
0 1 0 1 1
1 0 1 0 0
1 0 1 0 1
1 0 1 0 0
0 1 0 1 1
0 1 0 1 0
但是现在我需要对列应用相同的过程。因此,我使用列的二进制值计算
col\u val
向量:

12
3
12
3
3
要根据向量
列对矩阵
A
进行排序
我想我可以将矩阵
A
转置,然后像以前一样:

At = np.transpose(A)
At = [y for _,y in sorted(zip(col_val,At),reverse=True)]
不幸的是,此操作失败并显示错误消息

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

我怀疑这可能是因为vector
col\u val
中有多个具有相同值的条目,但是在排序中显示的示例中,似乎适用于具有多个相等条目的情况。

您的怀疑是正确的,您不能使用Python内置的排序方法对多维numpy数组进行排序,因为两行的比较将产生一行真值,而不是一行真值

A[0] < A[1]
# array([False,  True, False,  True, False])
说明:

np.packbits
顾名思义,将二进制向量打包到位字段中;它几乎等同于您的手写代码-有一个小小的区别是,
packbits
8
块上运行,并且在右边有零的pad,因此例如
[1,1]
将转到
192
,而不是
3


np.argsort
执行间接排序,因此它实际上不会移动其操作数
A
的元素,而是将索引序列
I
写入
A
,这将对其进行排序
A[I]=np.sort(A)
。当我们想根据类似于本例的其他内容的顺序对某个内容进行排序时,这非常有用。

哇,这非常简短!你能解释一下这是怎么回事吗?谢谢你的帮助。因此,尽管计算出的列和行的“二进制值”与我的示例中的不同,但这不会对矩阵的新顺序产生任何影响,对吗?对于行排序,我还可以编写
A[np.argsort(np.packbits(A,axis=1).ravel())[:::-1],:]
,以明确每一列只取行?@Axel yes和yes。非常感谢您的帮助!