在numpy中推广矩阵转置

6

假设 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]]])

你可以使用元组代替列表来表示不可分割的矩阵元素。 - Asad Saeeduddin
NumPy矩阵始终是二维的。您所需的矩阵是三维的。 - unutbu
你修改了问题还是将解决方案编辑到问题中了? - Asad Saeeduddin
@ Asad,我刚才在unutbu的帖子下面发表了评论。 - rsimha
1个回答

10
您所需的数组形状为(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 “旋转”轴。

我刚刚更改了我的帖子中的输出类型以与您的匹配。但是,如果您查看您的输出,它与我帖子中指定的不匹配。您可以将我的输出想象成一个列矩阵,其项都是列表。 - rsimha
@rsimha:确实,我误读了括号的放置。您想要的数组形状为(3,1,2)。b的形状为(3,2)。要在中间插入一个额外的维度(即“轴”),请使用b[:,None,:] - unutbu
@rsimha,一般情况下这是可行的。它允许您随意添加维度,只需选择正确的切片索引集即可。 - David Z
@DavidZaslavsky 謝謝。我會試試看,如有問題再聯繫您。 - rsimha
1
我还想提一下transpose方法,它可以替换一堆swapaxes调用,因为它允许您对轴应用置换而不仅仅是转置。 - jorgeca
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接