我如何在某种意义上 "juggle" ndarrays 中的元素?
How do I in a sense "juggle" elements in ndarrays?
我的意思是假设你有一个形状为 (2,3,4) 的 ndarray a。我想定义另一个形状为 (3,2,4) 的 ndarray b 使得
b[i][j][k] = a[j][i][k]
矩阵运算仅适用于最后两个索引位置。如果有一种方法可以使矩阵运算作用于任意 2 个选定的索引位置,那么一切都可以解决。
谢谢
你要找的大概是np.transpose(..)
(其实二维矩阵的转置就是一个特例):
b = a.<b>transpose((1, 0, 2))</b>
这里我们指定新矩阵的第一个索引(b
)是[=26=的第二个(1
)索引]旧矩阵 (a
);新矩阵的第二个索引是旧矩阵的第一个(0
)索引;新矩阵的第三个索引是旧矩阵的第三个索引(2
)。
这意味着如果 a
有 a.shape = (m, n, p)
,那么 b.shape = (n, m, p)
。
numpy.rollaxis(a, 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
也会受到影响。
我的意思是假设你有一个形状为 (2,3,4) 的 ndarray a。我想定义另一个形状为 (3,2,4) 的 ndarray b 使得
b[i][j][k] = a[j][i][k]
矩阵运算仅适用于最后两个索引位置。如果有一种方法可以使矩阵运算作用于任意 2 个选定的索引位置,那么一切都可以解决。
谢谢
你要找的大概是np.transpose(..)
(其实二维矩阵的转置就是一个特例):
b = a.<b>transpose((1, 0, 2))</b>
这里我们指定新矩阵的第一个索引(b
)是[=26=的第二个(1
)索引]旧矩阵 (a
);新矩阵的第二个索引是旧矩阵的第一个(0
)索引;新矩阵的第三个索引是旧矩阵的第三个索引(2
)。
这意味着如果 a
有 a.shape = (m, n, p)
,那么 b.shape = (n, m, p)
。
numpy.rollaxis(a, 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
也会受到影响。