从某种意义上说,我该如何在ndarrays中“杂耍”元素?

时间:2018-07-09 20:52:45

标签: python numpy multidimensional-array transpose numpy-ndarray

我的意思是,假设您有一个形状为(2,3,4)的ndarray a。我想定义另一个形状为(3,2,4)的ndarray b,使

b[i][j][k] = a[j][i][k]

矩阵运算仅适用于最后两个索引位置。如果有一种方法可以使矩阵运算作用于任意两个选定的索引位置,则可以解决所有问题。

谢谢

3 个答案:

答案 0 :(得分:1)

您正在寻找的可能是 np.transpose(..) (实际上,二维矩阵的转置就是这种情况的一种特殊情况):

b = a.transpose((1, 0, 2))

在此,我们指定新矩阵b)的第一个索引是旧矩阵的第二个索引(1) (a);新矩阵的第二个索引是旧矩阵的第一个(0)索引;而新矩阵的第三个索引是旧矩阵的第三个索引(2)。

因此,这意味着如果a具有a.shape = (m, n, p),则b.shape = (n, m, p)

答案 1 :(得分:1)

使用numpy.rollaxis

numpy.rollaxis(a, 1)

答案 2 :(得分:1)

按照您的想法,您可以使用numpy.einsum()来实现所需的目标。

In [21]: arr = np.random.randn(2,3,4)

In [22]: arr.shape
Out[22]: (2, 3, 4)

# swap first two dimensions
In [23]: rolled = np.einsum('ijk->jik', arr)

In [24]: rolled.shape
Out[24]: (3, 2, 4)

但是请注意要对结果数组执行的操作,因为会返回原始数组的 view 。因此,如果您修改rolled数组,原来的arr也将受到影响。