【问题标题】:Rearranging Matrix Elements with Numpy用 Numpy 重新排列矩阵元素
【发布时间】:2012-06-11 19:12:00
【问题描述】:

我有一个 NumPy 矩阵,我已对其进行了简化以举例说明:

       a  b  c  d  e  f 
A =  [[0, 1, 2, 3, 4, 5],
 b    [1, 0, 3, 4, 5, 6],
 c    [2, 3, 0, 5, 6, 7],
 d    [3, 4, 5, 0, 7, 8],
 e    [4, 5, 6, 7, 0, 9],
 f    [5, 6, 7, 8, 9, 0]]

“交叉点”处的数字很重要,但它们的顺序不正确。我想重新排列行和列,使新顺序为 [a, d, b, e, c, f] 但我称之为“交集”的这个值是相同的。

下面我已经开始按照我想要的方式转换矩阵。填充“e”行涉及查看上面的交叉点 (e,a) (= 4),然后是 (e,d) (=7) ,然后是 (e,b) (=5),(e,e) , (e,c), 和 (e,f)

       a  d  b  e  c  f
A1=  [[0, 3, 1, 4, 2, 5],
 d    [3, 0, 4, 7, 5, 8],
 b    [1, 4, 0, 5, 3, 6],  
 e    [4, 7, 5, 

谁能建议如何以这种方式重新排列我的矩阵?

【问题讨论】:

标签: python matrix numpy


【解决方案1】:

编辑:我刚刚偶然发现了一个使用 advanced indexing 的 NumPy 解决方案:

#                 a  b  c  d  e  f
A = numpy.array([[0, 1, 2, 3, 4, 5],
                 [1, 0, 3, 4, 5, 6],
                 [2, 3, 0, 5, 6, 7],
                 [3, 4, 5, 0, 7, 8],
                 [4, 5, 6, 7, 0, 9],
                 [5, 6, 7, 8, 9, 0]])

#            a  d  b  e  c  f
new_order = [0, 3, 1, 4, 2, 5]
A1 = A[:, new_order][new_order]

这是一个纯 Python 解决方案,可以转移到 NumPy:

#     a  b  c  d  e  f
A = [[0, 1, 2, 3, 4, 5],
     [1, 0, 3, 4, 5, 6],
     [2, 3, 0, 5, 6, 7],
     [3, 4, 5, 0, 7, 8],
     [4, 5, 6, 7, 0, 9],
     [5, 6, 7, 8, 9, 0]]

#            a  d  b  e  c  f
new_order = [0, 3, 1, 4, 2, 5]    # maps previous index to new index
A1 = [[A[i][j] for j in new_order] for i in new_order]

结果:

>>> pprint.pprint(A1)
[[0, 3, 1, 4, 2, 5],
 [3, 0, 4, 7, 5, 8],
 [1, 4, 0, 5, 3, 6],
 [4, 7, 5, 0, 6, 9],
 [2, 5, 3, 6, 0, 7],
 [5, 8, 6, 9, 7, 0]]

这里是修改A的版本:

A[:] = [A[i] for i in new_order]
for row in A:
    row[:] = [row[i] for i in new_order]

【讨论】:

  • 美丽的事物。这正是我想要的,而且非常紧凑。不过,我不明白“pprint.pprint”。此外,您的 cmets 使答案更容易阅读。作为一个新手,我很感激。
  • @wagras - pprint 是一个“漂亮打印”数据的模块,它只是一种以行/列格式打印数组和字典的简单方法,而不仅仅是单行.
  • @wagras - 如果您没有看到我的编辑,我为 NumPy 找到了更简洁的解决方案。
  • 我一直在关注您的所有更新。 :D 非常感谢您的周到。
【解决方案2】:

Numpy 提供了many 方法来操作数组,包括rolling elements along an xisrolling all axesswap axes。您可以使用这些组合来获得所需的元素顺序

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-15
    • 2017-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多