【问题标题】:Reshape array tuple重塑数组元组
【发布时间】:2023-12-17 11:45:01
【问题描述】:

我有 scipy.signal.con2discrete 的输出,它产生以下元组:

(array([[1., 0.],
        [1., 1.]]), array([[ 0.66      , -0.66      ],
        [ 0.33      , -1.49999601]]), array([0., 1.]), array([0., 0.]), 1)

这个对象的形状返回(5,)

我想去掉最后一个“1”,并将数组重建为具有形状 (4,3)。也就是说,我想要的最终数组应该是这样的:

1., 0., 0.66, -0.66
1., 1., 0.33, -1.5
0., 1., 0., 0.

如何在 numpy 中高效地做到这一点?

【问题讨论】:

  • 连接数组。可能需要几个步骤。
  • 是的,我认为这是一条好路。但挑战在于数组的大小不同。 A 和 B 都是 (2,2),C 和 D 都是 (1,2)。所以我可以连接 A 和 B,然后连接 C 和 D。但是如何进行最后的连接步骤?
  • 我会尝试一些连接和附加的组合。

标签: arrays numpy reshape


【解决方案1】:
In [584]: (array([[1., 0.], 
     ...:         [1., 1.]]), array([[ 0.66      , -0.66      ], 
     ...:         [ 0.33      , -1.49999601]]), array([0., 1.]), array([0., 0.])
     ...: , 1)                                                                  
Out[584]: 
(array([[1., 0.],
        [1., 1.]]), array([[ 0.66      , -0.66      ],
        [ 0.33      , -1.49999601]]), array([0., 1.]), array([0., 0.]), 1)
In [585]: x=_                                                                   
In [586]: len(x)                                                                
Out[586]: 5

In [588]: [i.shape for i in x[:4]]                                              
Out[588]: [(2, 2), (2, 2), (2,), (2,)]

In [590]: np.concatenate((x[0],x[1]), axis=1)                                   
Out[590]: 
array([[ 1.        ,  0.        ,  0.66      , -0.66      ],
       [ 1.        ,  1.        ,  0.33      , -1.49999601]])

In [591]: np.concatenate((x[2],x[3]), axis=0)                                   
Out[591]: array([0., 1., 0., 0.])

In [592]: np.vstack((__, _))                                                    
Out[592]: 
array([[ 1.        ,  0.        ,  0.66      , -0.66      ],
       [ 1.        ,  1.        ,  0.33      , -1.49999601],
       [ 0.        ,  1.        ,  0.        ,  0.        ]])

看起来block 可以用来做同样的事情:

In [594]: np.block([[x[0],x[1]],[x[2],x[3]]])                                   
Out[594]: 
array([[ 1.        ,  0.        ,  0.66      , -0.66      ],
       [ 1.        ,  1.        ,  0.33      , -1.49999601],
       [ 0.        ,  1.        ,  0.        ,  0.        ]])

【讨论】:

  • 就我而言,起始数组只有一种可能的大小。看起来我可以概括你的方法,这真的很棒。这是一个很好的开端,感谢您的回复。