在numpy中概括矩阵转置

7 投票
1 回答
8319 浏览
提问于 2025-04-17 19:32

让我们假设有一个名为 a 的列表,使用的是 Python 语言。

a = [1,2,3]

当我们对 a 进行矩阵转置操作时,得到的结果是:

np.matrix(a).transpose()
matrix([[1],
        [2],
        [3]])

我想把这个功能变得更通用,接下来我会用一个例子来说明我想做的事情。假设还有一个列表 b

b = [[1, 2], [2, 3], [3, 4]]

a 中,列表的内容是 1、2 和 3。我想把 [1,2][2,3][3,4] 看作是 b 中的列表项,这样做是为了进行转置操作。我希望输出结果如下:

array([[[1,2]],
       [[2,3]],
       [[3,4]]])

总的来说,我希望能够指定列表项的样子,并基于这个样子进行矩阵转置。

我可以简单写几行代码来实现上面的功能,但我问这个问题的目的是想知道是否有内置的 numpy 功能或者更 Pythonic 的方法来做到这一点。

编辑:unutbu 的输出结果和我上面的输出一致。不过,我想要一个能适用于更一般情况的解决方案。我在下面又贴了一个输入/输出示例。我的最初例子没有足够清晰地表达我想说的内容。假设 b 中的项是 [1,2][2,3][3,4][5,6]。那么下面给出的输出就是对更高维元素进行矩阵转置的结果。更一般地说,一旦我描述了“项”的样子,我想知道是否有办法进行类似转置的操作。

Input: b = [[[1, 2], [2, 3]], [[3, 4], [5,6]]]
Output: array([[[1,2], [3,4]],
               [[2,3], [5,6]]])

1 个回答

11

你想要的数组形状是 (3,1,2),而 b 的形状是 (3,2)。如果想在中间加一个新的维度,可以用 b[:,None,:],或者同样的 b[:, np.newaxis, :]。可以在 基本切片 的部分找到“newaxis”的相关信息。

In [178]: b = np.array([[1, 2], [2, 3], [3, 4]])

In [179]: b
Out[179]: 
array([[1, 2],
       [2, 3],
       [3, 4]])

In [202]: b[:,None,:]
Out[202]: 
array([[[1, 2]],

       [[2, 3]],

       [[3, 4]]])

另一个有用的工具是 np.swapaxes

In [222]: b = np.array([[[1, 2], [2, 3]], [[3, 4], [5,6]]])

In [223]: b.swapaxes(0,1)
Out[223]: 
array([[[1, 2],
        [3, 4]],

       [[2, 3],
        [5, 6]]])

转置操作 b.T 和交换第一个和最后一个维度 b.swapaxes(0,-1) 是一样的:

In [226]: b.T
Out[226]: 
array([[[1, 3],
        [2, 5]],

       [[2, 4],
        [3, 6]]])

In [227]: b.swapaxes(0,-1)
Out[227]: 
array([[[1, 3],
        [2, 5]],

       [[2, 4],
        [3, 6]]])

总结:

  • 使用 np.newaxis(或者 None)来增加新的维度。(这样可以增加数组的维度)
  • 使用 np.swapaxes 来交换任意两个维度。
  • 使用 np.transpose 一次性调整所有维度的顺序。(感谢 @jorgeca 提醒这一点。)
  • 使用 np.rollaxis 来“旋转”维度。

撰写回答