从某种意义上说,我如何在ndarrays中“玩弄”元素?

问题描述 投票:2回答:3

我的意思是想象你有一个有形状的ndarray(2,3,4)。我想定义另一个形状为(3,2,4)的ndarray b

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

矩阵运算仅适用于最后2个索引位置。如果有一种方法可以使矩阵运算对任何2个选定的索引位置起作用,那么一切都可以解决。

谢谢

python numpy multidimensional-array transpose numpy-ndarray
3个回答
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)

但要注意你想对结果数组做什么,因为返回了原始数组的视图。因此,如果你修改rolled数组,原来的arr也会受到影响。


1
投票

使用numpy.rollaxis

numpy.rollaxis(a, 1)

1
投票

您正在寻找的可能是np.transpose(..)(事实上,2D矩阵的转置是这个的特定情况):

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

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

这意味着如果aa.shape = (m, n, p),那么b.shape = (n, m, p)

© www.soinside.com 2019 - 2024. All rights reserved.