Python使用np.reshape按特定顺序重新整形数组

时间:2017-01-10 02:09:20

标签: python arrays numpy reshape

我有一个数组(a),形状为(1800,144),其中a[0:900,:]都是实数,而数组a[900:1800,:]的后半部分都是零。我想取数组的后半部分并将它放在水平的前半部分并将它们推到一起,以便新的数组形状(a)为(900,288),数组a将如下所示:

[[1,2,3,......,0,0,0],
 [1,2,3,......,0,0,0],
 ...
]

如果这是有道理的。

当我尝试使用np.reshape(a,(900,288))时,它并不完全符合我的要求。它使数组中的所有实数都来自a[0:450,:],而零来自a[450:900,:]。我希望将所有零都添加到第二维上,以便从a[0:900,0:144]获取全部实数,a[0:900,144:288]全部为零。

有一种简单的方法吗?

2 个答案:

答案 0 :(得分:1)

您可以使用numpy.hstack()连接两个数组:

import numpy as np
np.hstack([a[0:900,], a[900:1800,]])

如果您想将数组拆分为两个以上的子数组,可以将np.splitnp.hstack的用法结合使用,如@ HM14所评论的那样:

np.hstack(np.split(a, n))  # assuming len(a) % n == 0 here

答案 1 :(得分:1)

抱歉,这个评论太大了,所以我会在这里发布。 如果你有一个长数组,你需要拆分它并重新组装它,还有其他方法可以实现这一点。此示例显示如何将同样大小的数字序列组合到单个数组中。

a = np.arange(100)
>>> b = np.split(a,10)
>>> c = np.c_[b]
>>> c
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],
       [40, 41, 42, 43, 44, 45, 46, 47, 48, 49],
       [50, 51, 52, 53, 54, 55, 56, 57, 58, 59],
       [60, 61, 62, 63, 64, 65, 66, 67, 68, 69],
       [70, 71, 72, 73, 74, 75, 76, 77, 78, 79],
       [80, 81, 82, 83, 84, 85, 86, 87, 88, 89],
       [90, 91, 92, 93, 94, 95, 96, 97, 98, 99]])

因此您可以轻松拆分序列并轻松重新组装。如果需要,您可以重新排序堆叠顺序。也许这更容易在这个序列中显示出来。

d = np.r_[b[5:],b[:5]].ravel()
>>> d
array([50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67,
       68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85,
       86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99,  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,
       40, 41, 42, 43, 44, 45, 46, 47, 48, 49])

此示例仅显示您可以采用最后五个拆分序列并将它们扔到堆的前面。 如果你有一系列值,即使长度不等,也不应该花很长时间,你可以将它们放在一个列表中并使用np.c_和np.r_便利函数重新组装它们(np.c_将通常期望相同大小的数组)。

所以不是解决你的具体案例,而是一些关于如何以各种方式重新组装样本的建议。