在一个numpy阵列中重新安排

时间:2014-07-27 13:42:28

标签: python arrays numpy

我有一个numpy数组,如下所示:

[ 1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.
  1.  1.  1.  1.  2.  2.  2.  2.  2.  2.  2.  2.  2.  2.  2.  2.  2.  2.
  2.  2.  2.  2.  2.  2.  2.  2.  3.  3.  3.  3.  3.  3.  3.  3.  3.  3.
  3.  3.  3.  3.  3.  3.  3.  3.  3.  3.  3.  3.  4.  4.  4.  4.  4.  4.
  4.  4.  4.  4.  4.  4.  4.  4.  4.  4.  4.  4.  4.  4.  4.  4.  5.  5.
  5.  5.  5.  5.  5.  5.  5.  5.  5.  5.  5.  5.  5.  5.  5.  5.  5.  5.
  5.  5.  6.  6.  6.  6.  6.  6.  6.  6.  6.  6.  6.  6.  6.  6.  6.  6.
  6.  6.  6.  6.  6.  6.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.
  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  2.  2.  2.  2.  2.  2.  2.  2.
  2.  2.  2.  2.  2.  2.  2.  2.  2.  2.  2.  2.  2.  2.  3.  3.  3.  3.
  3.  3.  3.  3.  3.  3.  3.  3.  3.  3.  3.  3.  3.  3.  3.  3.  3.  3.
  4.  4.  4.  4.  4.  4.  4.  4.  4.  4.  4.  4.  4.  4.  4.  4.  4.  4.
  4.  4.  4.  4.  5.  5.  5.  5.  5.  5.  5.  5.  5.  5.  5.  5.  5.  5.
  5.  5.  5.  5.  5.  5.  5.  5.  6.  6.  6.  6.  6.  6.  6.  6.  6.  6.
  6.  6.  6.  6.  6.  6.  6.  6.  6.  6.  6.  6.  1.  1.  1.  1.  1.  1.
  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  2.  2.
  2.  2.  2.  2.  2.  2.  2.  2.  2.  2.  2.  2.  2.  2.  2.  2.  2.  2.
  2.  2.  3.  3.  3.  3.  3.  3.  3.  3.  3.  3.  3.  3.  3.  3.  3.  3.
  3.  3.  3.  3.  3.  3.  4.  4.  4.  4.  4.  4.  4.  4.  4.  4.  4.  4.
  4.  4.  4.  4.  4.  4.  4.  4.  4.  4.  5.  5.  5.  5.  5.  5.  5.  5.
  5.  5.  5.  5.  5.  5.  5.  5.  5.  5.  5.  5.  5.  5.  6.  6.  6.  6.
  6.  6.  6.  6.  6.  6.  6.  6.  6.  6.  6.  6.  6.  6.  6.  6.  6.  6.
  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.
  1.  1.  1.  1.  2.  2.  2.  2.  2.  2.  2.  2.  2.  2.  2.  2.  2.  2.
  2.  2.  2.  2.  2.  2.  2.  2.  3.  3.  3.  3.  3.  3.  3.  3.  3.  3.
  3.  3.  3.  3.  3.  3.  3.  3.  3.  3.  3.  3.  4.  4.  4.  4.  4.  4.
  4.  4.  4.  4.  4.  4.  4.  4.  4.  4.  4.  4.  4.  4.  4.  4.  5.  5.
  5.  5.  5.  5.  5.  5.  5.  5.  5.  5.  5.  5.  5.  5.  5.  5.  5.  5.
  5.  5.  6.  6.  6.  6.  6.  6.  6.  6.  6.  6.  6.  6.  6.  6.  6.  6.
  6.  6.  6.  6.  6.  6.]

现在我需要重新排列数组而不进行任何分割或切片,以便将所有的1s,2s,--- 6组合在一起。什么是最好的方式?每22个元素后,数字会发生变化。所以新数组应该有每个数字的88个条目。

问题的b部分:

如果我有一个带有形状的上述数组的扩展形式(528,32768),并且数组中的值现在是完全随机的,我需要在1s,2s,3s的索引处对值进行分组..... ..没有排序;什么是最好的方式?

2 个答案:

答案 0 :(得分:2)

这可能不是最快的解决方案:

array( sorted( a ) )

答案 1 :(得分:1)

这是你的数组

import numpy as np
arr = ((np.arange(24) % 6 + 1)[:, np.newaxis] * np.ones(22)).ravel()

或者这个

arr = ((np.arange(6)[:, np.newaxis] * np.ones(22))[np.newaxis]
        * np.ones([4, 1, 1])).ravel() + 1

现在尝试

arr.reshape(-1, 6, 22).transpose(1, 0, 2).reshape(6, -1)

这是在转置之前阵列上的不同视图。在第二次重塑numpy必须复制。


这是一种重新排列4通道光谱仪数据的方法,其中包含评论中描述的数据规范:

# data vectors stacked (4 * 132)
data = np.random.randn(528, 32768)

# data vectors divided into original 4 blocks
data.reshape(4, 132, 32768)

# data vectors subdivided into 6 * 22 = 132
data.reshape(4, 6, 22, 32768)

如您所见,将数据划分到适当的隔间可以使用单个(最后一个)重塑。使用transpose进行重新排列,如下所示:

# the following operation switches dimensions 0 and 1
# yielding a vector of shape (6, 4, 22, 32768)
data.reshape(4, 6, 22, 32768).transpose(1, 0, 2, 3)

# stack all 4 outputs of 22 lines together into blocks of 88 lines
data.reshape(4, 6, 22, 32768).transpose(1, 0, 2, 3).reshape(6, 88, 32768)

# concatenate everything back to get a reordered matrix
data.reshape(4, 6, 22, 32768).transpose(1, 0, 2, 3).reshape(6 * 88, 32768)