在numpy中概括矩阵转置
让我们假设有一个名为 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 来“旋转”维度。