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]]])
4

1 回答 1

7

您想要的数组具有形状 (3,1,2)。b具有形状 (3,2)。要在中间添加一个额外的轴,请使用b[:,None,:], 或 (等价地) b[:, np.newaxis, :]在 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 “旋转”轴。
于 2013-03-18T17:39:02.350 回答