【问题标题】:Is there a Pythonic way to transpose 1 row/column of a numpy matrix?是否有一种 Pythonic 方法来转置 numpy 矩阵的 1 行/列?
【发布时间】:2020-12-10 16:10:57
【问题描述】:

假设我有一个 8x8 矩阵:
[
0 1 1 1 1 1 1 1
0 0 1 1 1 1 1 1
0 0 0 1 1 1 1 1
0 0 0 0 1 1 1 1
0 0 0 0 0 1 1 1
0 0 0 0 0 0 1 1
0 0 0 0 0 0 0 1
0 0 0 0 0 0 0 0
]

我想在 2 点之间转置其中的一行/列。例如,如果我想在 2,2 和 6,6 之间转置(其中 1,1 是最左上角的值),新矩阵应该如下所示
[
0 1 1 1 1 1 1 1
0 0 0 0 0 0 1 1
0 1 0 1 1 0 1 1
0 1 0 0 1 0 1 1
0 1 0 0 0 0 1 1
0 1 1 1 1 0 1 1
0 0 0 0 0 0 0 1
0 0 0 0 0 0 0 0
]

有没有这样做的好方法。我尝试将行复制到列中,将列复制到行中,但是当我开始使用变量名作为两个点之间进行转置时,它变得很难看

谢谢

【问题讨论】:

  • 是否允许使用 numpy 库?
  • 是的@Keredu,我正在使用 numpy 数组
  • 想象一下,您可以将示例中的矩阵设为x = np.triu(np.ones((8,8), dtype=int), 1)...
  • 嗨@Scotty1-问题并不像执行矩阵转置那么简单,因为正如标题中所说,我只希望它在一行/列上执行......

标签: python numpy matrix transpose


【解决方案1】:

你可以这样做:

import numpy as np

arr = np.array([
    [0, 1, 1, 1, 1, 1, 1, 1],
    [0, 0, 1, 1, 1, 1, 1, 1],
    [0, 0, 0, 1, 1, 1, 1, 1],
    [0, 0, 0, 0, 1, 1, 1, 1],
    [0, 0, 0, 0, 0, 1, 1, 1],
    [0, 0, 0, 0, 0, 0, 1, 1],
    [0, 0, 0, 0, 0, 0, 0, 1],
    [0, 0, 0, 0, 0, 0, 0, 0]
])

arr[1:6, 1:6] = arr[1:6, 1:6].T
arr[2:5, 2:5] = arr[2:5, 2:5].T

print(arr)

输出

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

想法是转置子矩阵,然后再次转置子矩阵的内部

【讨论】:

  • 听起来很浪费(O(N^2) 操作,当O(N) 可用并且更容易输入时)...
【解决方案2】:

您可以简单地交换列,然后交换行:

x = np.arange(16).reshape((4, 4))

r0, r1 = 0, 1
c0, c1 = 2, 3

x[:, (c0, c1)] = x[:, (c1, c0)]
x[(r0, r1), :] = x[(r1, r0), :]

x
array([[ 4,  5,  7,  6],
       [ 0,  1,  3,  2],
       [ 8,  9, 11, 10],
       [12, 13, 15, 14]])

专门针对您的示例(抱歉,索引从 0 开始,正如 Nature 所期望的那样):

# setup
x = np.triu(np.ones((8,8), dtype=int), 1)

p0 = 1, 1
p1 = 5, 5
r0, c0, r1, c1 = p0 + p1
# operation
x[:, (c0, c1)] = x[:, (c1, c0)]
x[(r0, r1), :] = x[(r1, r0), :]

print(x)
[[0 1 1 1 1 1 1 1]
 [0 0 0 0 0 0 1 1]
 [0 1 0 1 1 0 1 1]
 [0 1 0 0 1 0 1 1]
 [0 1 0 0 0 0 1 1]
 [0 1 1 1 1 0 1 1]
 [0 0 0 0 0 0 0 1]
 [0 0 0 0 0 0 0 0]]

【讨论】:

  • 是的,我就是这样做的。我想知道是否有更漂亮、更 Pythonic 的方式来做这件事,但如果它是最有效的,那就坚持下去。谢谢
【解决方案3】:
import numpy as np

matrix = np.array([[1,2,3,4],
                   [5,6,7,8],
                   [9,10,11,12],
                   [13,14,15,16]])

p1 = (1,1)
p2 = (3,3)
sub_matrix = matrix[p1[0]:p2[0], p1[1]:p2[1]]
matrix[p1[0]:p2[0], p1[1]:p2[1]] = np.transpose(sub_matrix)
print(matrix) # returns [[ 1  2  3  4]
              #          [ 5  6 10  8]
              #          [ 9  7 11 12]
              #          [13 14 15 16]]

【讨论】:

    猜你喜欢
    • 2020-07-01
    • 2015-07-06
    • 2010-09-30
    • 1970-01-01
    • 1970-01-01
    • 2016-06-27
    • 1970-01-01
    • 2011-09-24
    • 2013-11-18
    相关资源
    最近更新 更多