有效地改变numpy数组的顺序

时间:2016-10-14 11:54:35

标签: python numpy

我有一个3维numpy数组。尺寸最大可达128 x 64 x 8192.我想要做的是通过成对交换来改变第一维的顺序。

到目前为止,我唯一的想法是按照正确的顺序创建索引列表。

order    = [1,0,3,2...127,126]
data_new = data[order]

我担心,这不是很有效但到目前为止我没有更好的想法

1 个答案:

答案 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()