【问题标题】:Reshape arrays with python用python重塑数组
【发布时间】:2024-01-02 03:28:01
【问题描述】:

我有数组

A = array([[  1.,   2.,   3.,  10.,  11.,  12.],
           [  4.,   5.,   6.,  13.,  14.,  15.],
           [  7.,   8.,   9.,  16.,  17.,  18.],
           [ 19.,  20.,  21.,  28.,  29.,  30.],
           [ 22.,  23.,  24.,  31.,  32.,  33.],
           [ 25.,  26.,  27.,  34.,  35.,  36.]])

我想重塑它以获得

B = [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]

我试过了

>>> B = A.reshape(1,36)
array([[  1.,   2.,   3.,  10.,  11.,  12.,   4.,   5.,   6.,  13.,  14.,
         15.,   7.,   8.,   9.,  16.,  17.,  18.,  19.,  20.,  21.,  28.,
         29.,  30.,  22.,  23.,  24.,  31.,  32.,  33.,  25.,  26.,  27.,
         34.,  35.,  36.]])

但是,很明显,我没有达到结果。我的真实数据与示例不同,所以无法对数组A进行排序得到B

我想我需要更多的重塑......

【问题讨论】:

  • 你能提供更多的上下文吗?严格来说,numpy.sort(A.flatten()) 会达到这个效果。但我猜这不是您的真实数据,我们不能依靠排序来获得您想要的顺序。
  • @PaulH 我已经编辑了这个问题。您的答案适用于该示例,但我不能使用排序(我有随机数)
  • 我想通了。还需要更多细节。您试图制定的解决方案有多通用?例如:您是否总是要处理一个被划分为象限的方形数组(N x N,其中 N 是偶数)?还是总是分成任意数量的 3x3 块?

标签: python arrays numpy reshape


【解决方案1】:

分割这两个轴中的每一个,使剩余的长度为2,每个轴都有一个reshape,给我们一个4D数组,然后用np.swapaxes()交换中间的两个轴,最后用@987654325展平@-

A.reshape(2,3,2,3).swapaxes(1,2).ravel()

一般来说-

m,n = A.shape
A.reshape(2,m//2,2,n//2).swapaxes(1,2).ravel()

示例运行 -

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

In [16]: A.reshape(2,3,2,3).swapaxes(1,2).ravel()
Out[16]: 
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.])

【讨论】: