将多个子矩阵重新整形/组合成多维空间中的一个矩阵

时间:2016-01-05 07:49:44

标签: python arrays numpy multidimensional-array vectorization

我有一个大小为(2,2,4,2,2)的5D二进制数组'a'。结构看起来像这样,例如:

a[0,0]:
[[[ 0.  1.]
  [ 0.  0.]]

 [[ 0.  0.]
  [ 0.  1.]]

 [[ 0.  0.]
  [ 0.  1.]]

 [[ 0.  0.]
  [ 1.  0.]]]

我想做的是制作一个(2,2,4,4)矩阵,它在最后两个轴中组合2x2矩阵,但是采用方形结构。

结果应如下所示:

result[0,0]:
[[0. 1. 0. 0.]
 [0. 0. 0. 1.]
 [0. 0. 0. 0.]
 [0. 1. 1. 0.]]

我希望这很清楚。如果我将原始矩阵的括号放在结果中,它看起来像这样:

result[0,0]:
[[[0. 1. [0. 0.]
 [0. 0.] 0. 1.]]
 [[0. 0. [0. 0.]
 [0. 1.] 1. 0.]]]

2 个答案:

答案 0 :(得分:3)

您似乎正在将第3轴从(4)分解为(2,2)并将分割轴的前半部分引入第二个最后轴位置。因此,有两种方法可以使用np.reshapenp.transpose来实现此类输出,就像这样 -

out = a.reshape(2,2,2,2,2,2).transpose(0,1,3,4,2,5).reshape(2,2,4,4)

out = a.reshape(2,2,2,-1,2).transpose(0,1,3,2,4).reshape(2,2,4,4)

示例运行 -

In [69]: a[0][0]
Out[69]: 
array([[[49, 91],
        [10, 32]],

       [[71, 27],
        [50, 64]],

       [[ 9, 41],
        [73, 52]],

       [[54, 85],
        [53, 36]]])

In [70]: out1 = a.reshape(2,2,2,2,2,2).transpose(0,1,3,4,2,5).reshape(2,2,4,4)

In [71]: out2 = a.reshape(2,2,2,-1,2).transpose(0,1,3,2,4).reshape(2,2,4,4)

In [72]: out1[0][0]
Out[72]: 
array([[49, 91,  9, 41],
       [10, 32, 73, 52],
       [71, 27, 54, 85],
       [50, 64, 53, 36]])

In [73]: out2[0][0]
Out[73]: 
array([[49, 91,  9, 41],
       [10, 32, 73, 52],
       [71, 27, 54, 85],
       [50, 64, 53, 36]])

答案 1 :(得分:2)

首先,最好将您的数组编入索引,例如a[0,0]a[0,0,...]a[0,0,:,:]

a.reshape(2,2, 4,4)能做你想做的吗?这保留了所有值,但将最内层的(2,2)数组重新整形为(4,)数组。

仔细观察看起来您想要对内部数组中的值重新排序。根据您的描述,这并不完全明显。我必须仔细匹配显示之间的值。特别是它只有2个不明确的子阵列:

[[ 0.  0.]
  [ 0.  1.]]

 [[ 0.  0.]
  [ 1.  0.]]]

[0. 0. 0. 0.]
 [0. 1. 1. 0.]]

我们需要做的是在重塑之前调换最后2个轴。

这可能会起到作用:

a.transpose(0,1,2,4,3).reshape(2,2,4,4)

它可以与np.ones((2,2,4,2,2))一起使用,但我还没有使用与您的问题重复的数字对其进行测试 - 因为您没有提供可以剪切粘贴的测试用例。

oops - 看起来像Divakar做对了。我们需要将4维度分解为2,2,并跨维度执行转置。

In [290]: a=np.array([[[0,1],[0,0]],[[0,0],[0,1]],[[0,0],[0,1]],[[0,0],[1,0]]])
In [291]: a
Out[291]: 
array([[[0, 1],
        [0, 0]],

       [[0, 0],
        [0, 1]],

       [[0, 0],
        [0, 1]],

       [[0, 0],
        [1, 0]]])
In [292]: a.reshape(2,2,2,2).transpose(0,2,1,3).reshape(4,4)
Out[292]: 
array([[0, 1, 0, 0],
       [0, 0, 0, 1],
       [0, 0, 0, 0],
       [0, 1, 1, 0]])

这里有一个更清晰的例子:

In [303]: a=np.arange((4*2*2)).reshape(4,2,2)
In [304]: a.reshape(2,2,2,2).transpose(0,2,1,3).reshape(4,4)
Out[304]: 
array([[ 0,  1,  4,  5],
       [ 2,  3,  6,  7],
       [ 8,  9, 12, 13],
       [10, 11, 14, 15]])

如果每个维度都不同,那就更好了,因此对哪些维度的组合更加模糊。

In [308]: a=np.arange((6*5*7)).reshape(6,5,7)
In [309]: a.reshape(2,3,5,7).transpose(0,2,1,3).reshape(10,21)