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

标签 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

然后,对于我接下来的过程,我需要将矩阵的行视为二进制数,并按二进制值的降序对它们进行排序。

我按照以下方式执行此操作:

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 向量 row_val:

21
10
11
20

现在我根据 row_val 对矩阵的行进行排序

A = [x for _,x in sorted(zip(row_val,A),reverse=True)]

这工作得很好,我得到了矩阵A:

1 0 1 0 1
1 0 1 0 0
0 1 0 1 1
0 1 0 1 0

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

12
3
12
3
3

要根据向量 col_val 对矩阵 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()

我怀疑这可能是因为向量 col_val 中有多个具有相同值的条目,但是在 another question 中显示的示例中排序似乎适用于具有多个相同条目的情况。

最佳答案

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

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

所以已排序无法判断哪个应该排在另一个之前。

在您的第一个示例中,这被元组的字典顺序所掩盖:因为元组是从左到右比较的,并且因为 row_val 具有唯一的条目,所以比较永远不会查看第二个元素。

但是在第二个示例中,由于某些 col_val 条目相等,因此比较将在 At 中查找平局断路器,这就是异常发生的地方。

这是一个使用 numpy 方法的工作方法:

A[np.argsort(np.packbits(A, axis=1).ravel())[::-1]]
# array([[1, 0, 1, 0, 1],
#        [1, 0, 1, 0, 0],
#        [0, 1, 0, 1, 1],
#        [0, 1, 0, 1, 0]])
A[:, np.argsort(np.packbits(A, axis=0).ravel())[::-1]]
# array([[1, 1, 1, 0, 0],
#        [0, 0, 0, 1, 1],
#        [1, 0, 0, 1, 1],
#        [0, 1, 1, 0, 0]])

说明:

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

np.argsort 进行间接排序,因此它实际上并不移动其操作数 A 的元素,而只是写下索引 I 的序列A 中,这会对 A[I] == np.sort(A) 进行排序。当我们想要根据其他内容的顺序对某些内容进行排序(就像本例中那样)时,这非常有用。

关于python - 按另一个矩阵排序在一种情况下有效,但在另一种情况下失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49681081/

相关文章:

python - 此消息总是指索引问题?索引错误 : index out of bounds

python - 如何访问模型中外键的​​属性?

python - 为什么这两条 Shebang 系列都兼容?

sorting - Backbone.js 中的分页集合

java - Collections.sort 带有 2 个数组

sorting - ExtJS GridPanel中的服务器端排序

python - 将行附加到 Pandas DataFrame

python - PANDAS 中类似 SQL 的窗口函数 : Row Numbering in Python Pandas Dataframe

Python-密码库

python - HelpFormatter 在点击