我有一个3维numpy数组。尺寸最大可达128 x 64 x 8192.我想要做的是通过成对交换来改变第一维的顺序。
到目前为止,我唯一的想法是按照正确的顺序创建索引列表。
order = [1,0,3,2...127,126]
data_new = data[order]
我担心,这不是很有效但到目前为止我没有更好的想法
答案 0 :(得分:4)
你可以重塑以将第一个轴分成两个轴,这样这些轴中的后一个轴的长度为2
,然后沿着该轴以[::-1]
翻转阵列,最后重新塑造成原始形状
因此,我们会有这样的实现 -
a.reshape(-1,2,*a.shape[1:])[:,::-1].reshape(a.shape)
示例运行 -
In [170]: a = np.random.randint(0,9,(6,3))
In [171]: order = [1,0,3,2,5,4]
In [172]: a[order]
Out[172]:
array([[0, 8, 5],
[4, 5, 6],
[0, 0, 2],
[7, 3, 8],
[1, 6, 3],
[2, 4, 4]])
In [173]: a.reshape(-1,2,*a.shape[1:])[:,::-1].reshape(a.shape)
Out[173]:
array([[0, 8, 5],
[4, 5, 6],
[0, 0, 2],
[7, 3, 8],
[1, 6, 3],
[2, 4, 4]])
或者,如果您希望有效地创建那些不断翻转索引order
,我们可以做这样的事情 -
order = np.arange(data.shape[0]).reshape(-1,2)[:,::-1].ravel()