重新排序numpy数组python

时间:2015-11-03 19:16:58

标签: python arrays numpy

我有一个像这样的大二维数组:

array([[ 1, 2, 3, 4, 5, 6, 7, 8],
       [ 9,10,11,12,13,14,15,16],
       [17,18,19,20,21,22,23,24],
       [25,26,27,28,29,30,31,32],
       [33,34,35,36,37,38,39,40],
       [41,42,43,44,45,46,47,48],
       ....])

我需要将其转换为:

array([ 1, 9,17, 2,10,18, 3,11,19, 4,12,20, 5,13,21, 6,14,22, 7,15,23, 8,16,24],
      [25,33,41,26,34,42,27,35,43,28,36,44,29,37,45,30,38,46,31,39,47,32,40,48],
      ...

请注意,这只应该是它应该做什么的示范 原始数组仅包含布尔值,大小为512x8。在我的例子中,我只订购了3行,其中8行包含在一行中,但我真正需要的是分别为32行和8行元素。

我很抱歉,但写了30分钟后,这是我对我的问题的唯一描述。我希望这就够了。

2 个答案:

答案 0 :(得分:5)

我认为您可以使用两个reshape操作和一个transpose来实现您想要的结果:

test

稍微打破一下:

  1. @ hpaulj的第一个x = np.array([[ 1, 2, 3, 4, 5, 6, 7, 8], [ 9,10,11,12,13,14,15,16], [17,18,19,20,21,22,23,24], [25,26,27,28,29,30,31,32], [33,34,35,36,37,38,39,40], [41,42,43,44,45,46,47,48]]) y = x.reshape(2, 3, 8).transpose(0, 2, 1).reshape(2, -1) print(repr(y)) # array([[ 1, 9, 17, 2, 10, 18, 3, 11, 19, 4, 12, 20, 5, 13, 21, 6, 14, # 22, 7, 15, 23, 8, 16, 24], # [25, 33, 41, 26, 34, 42, 27, 35, 43, 28, 36, 44, 29, 37, 45, 30, 38, # 46, 31, 39, 47, 32, 40, 48]]) 操作为我们提供了这个:

    reshape
  2. 为了获得所需的输出,我们需要沿第二维(大小为3)“折叠”此数组,然后沿第三维(大小为8)。 实现此类事情的最简单方法是先x1 = x.reshape(2, 3, 8) print(repr(x1)) # array([[[ 1, 2, 3, 4, 5, 6, 7, 8], # [ 9, 10, 11, 12, 13, 14, 15, 16], # [17, 18, 19, 20, 21, 22, 23, 24]], # [[25, 26, 27, 28, 29, 30, 31, 32], # [33, 34, 35, 36, 37, 38, 39, 40], # [41, 42, 43, 44, 45, 46, 47, 48]]]) print(x1.shape) # (2, 3, 8) 数组,以便您要折叠的尺寸从头到尾排序:

    transpose
  3. 最后,我可以使用x2 = x1.transpose(0, 2, 1) # you could also use `x2 = np.rollaxis(x1, 1, 3)` print(repr(x2)) # array([[[ 1, 9, 17], # [ 2, 10, 18], # [ 3, 11, 19], # [ 4, 12, 20], # [ 5, 13, 21], # [ 6, 14, 22], # [ 7, 15, 23], # [ 8, 16, 24]], # [[25, 33, 41], # [26, 34, 42], # [27, 35, 43], # [28, 36, 44], # [29, 37, 45], # [30, 38, 46], # [31, 39, 47], # [32, 40, 48]]]) print(x2.shape) # (2, 8, 3) 在最后两个维度上折叠数组。 reshape(2, -1)会导致numpy根据-1中的元素数推断最后一维中的相应大小。

    x

答案 1 :(得分:1)

看起来像是重塑它的起点,例如

In [49]: x.reshape(2,3,8)
Out[49]: 
array([[[ 1,  2,  3,  4,  5,  6,  7,  8],
        [ 9, 10, 11, 12, 13, 14, 15, 16],
        [17, 18, 19, 20, 21, 22, 23, 24]],

       [[25, 26, 27, 28, 29, 30, 31, 32],
        [33, 34, 35, 36, 37, 38, 39, 40],
        [41, 42, 43, 44, 45, 46, 47, 48]]])

.ravel(order='F')没有把它弄好,所以我认为我们需要在展平之前交换一些轴。它需要是一份副本。

使用@ ali_m的转置:

In [65]: x1=x.reshape(2,3,8)

In [66]: x1.transpose(0,2,1).flatten()
Out[66]: 
array([ 1,  9, 17,  2, 10, 18,  3, 11, 19,  4, 12, 20,  5, 13, 21,  6, 14,
       22,  7, 15, 23,  8, 16, 24, 25, 33, 41, 26, 34, 42, 27, 35, 43, 28,
       36, 44, 29, 37, 45, 30, 38, 46, 31, 39, 47, 32, 40, 48])

哎呀 - 有一个容易错过的内层嵌套

array([1,9,17,2,10,18,3,11,19,4,12,20,5,13,21,6,14,22,7,15,23,8,16,24],
      [25,33,41,26,34,42,27,35,43,28,36,44,29,37,45,30,38,46,31,39,47,32,40,4],

您错过了[]集。所以@ali_m做对了。

我很想删除它,但我的反复试验可能会有所帮助。