广义矩阵转置在numpy中

时间:2013-03-18 17:31:28

标签: python 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 个答案:

答案 0 :(得分:4)

您想要的阵列有形状(3,1,2)。 b有形状(3,2)。要在中间粘贴额外的轴,请使用b[:,None,:]或(等效)b[:, np.newaxis, :]。在section on Basic Slicing中查找“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“旋转”轴。