将x列的组从列转换为行numpy数组

cbwuti44  于 2023-03-23  发布在  其他
关注(0)|答案(1)|浏览(123)

我有一个5x8数组(例如)

[[ 43 153  39  40 157 116  78 165]
 [108 182  42 244  28  67  59 176]
 [ 44  81 236 229 102  32 176 237]
 [143 218  78  77 237 194 135 251]
 [247  37 143  89 100 188 156 206]]

我想把它写成一个10x4的数组。不是一个简单的整形,而是我想把前两列0和1保持原样。第2列和第3列我想把它们写成行,放在数组的底部。第4列和第5列会移动到第2列的原始位置,最后,第6和第7列将作为行移动到第4和第5列下面。结果如下所示:

[[ 43 153 157 116]
  [108 182  28  67]
  [ 44  81 102  32]
  [143 218 237 194]
  [247  37 100 188]
  [ 39  40  78 165]
  [ 42 244  59 176]
  [236 229 176 237]
  [ 78  77 135 251]
  [143  89 156 206]]

我试着用新的形状创建一个新的零数组,并将这些零添加到新数组中,但遇到了一堆错误消息,例如“operands cannot be broadcast together with shapes(10,4)(5,2)”有没有一种理想的方法来做到这一点?对于numpy和数组切片来说有点陌生,我如何以这种格式将内容写入新数组。
设置这个问题的正确方法是什么?我是创建一个空数组,还是写一个新数组,然后在操作行和列时重塑形状?我已经简化了这个例子,但我实际上想对灰度图像这样做。

rggaifut

rggaifut1#

与输入所有数字不同,我将创建一个(5,8)数组,如下所示:

In [51]: arr = np.arange(40).reshape(5,8)

In [52]: arr
Out[52]: 
array([[ 0,  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]])

有很多种方法可以将数组分成块,然后重新排列它们。一种直接的方法是使用np.block并连接4个两列块。这可能不是最通用的,但很容易写出:

In [53]: np.block([[arr[:,0:2],arr[:,4:6]],[arr[:,2:4],arr[:, 6:8]]])
Out[53]: 
array([[ 0,  1,  4,  5],
       [ 8,  9, 12, 13],
       [16, 17, 20, 21],
       [24, 25, 28, 29],
       [32, 33, 36, 37],
       [ 2,  3,  6,  7],
       [10, 11, 14, 15],
       [18, 19, 22, 23],
       [26, 27, 30, 31],
       [34, 35, 38, 39]])

split也可以将其划分为以下4个块:

In [54]: alist = np.split(arr, 4, axis=1)

In [55]: alist
Out[55]: 
[array([[ 0,  1],
        [ 8,  9],
        [16, 17],
        [24, 25],
        [32, 33]]),
 array([[ 2,  3],
        [10, 11],
        [18, 19],
        [26, 27],
        [34, 35]]),
 array([[ 4,  5],
        [12, 13],
        [20, 21],
        [28, 29],
        [36, 37]]),
 array([[ 6,  7],
        [14, 15],
        [22, 23],
        [30, 31],
        [38, 39]])]

下面是一个工作的整形和转置序列:

In [64]: arr.reshape(5,2,2,2).transpose(2,0,1,3).reshape(10,4)
Out[64]: 
array([[ 0,  1,  4,  5],
       [ 8,  9, 12, 13],
       [16, 17, 20, 21],
       [24, 25, 28, 29],
       [32, 33, 36, 37],
       [ 2,  3,  6,  7],
       [10, 11, 14, 15],
       [18, 19, 22, 23],
       [26, 27, 30, 31],
       [34, 35, 38, 39]])

我经过一些反复试验,在以前这种重组经验的帮助下,达到了这个目的。

相关问题