如何在 Python 中将一个数组中的多列堆叠在一起?

Posted

技术标签:

【中文标题】如何在 Python 中将一个数组中的多列堆叠在一起?【英文标题】:How do I stack multiple columns from one single array on top of each other in Python? 【发布时间】:2019-11-30 11:59:13 【问题描述】:

比如数组的形状是5,4。

a = np.random.randint(10, size= (5, 4))

a = 
[[1 4 5 0]
 [3 1 5 1]
 [4 8 0 9]
 [8 1 5 8]
 [6 4 7 4]]

我希望将数组重新整形为:

a = 
[[1 4]
 [3 1]
 [4 8]
 [8 1]
 [6 4]
 [5 0]
 [5 1]
 [0 9]
 [5 8]
 [7 4]]

我的原始数组大小约为 200 GB,形状为 80000*480600。我曾尝试使用重映射模式,但速度很慢。

【问题讨论】:

您需要添加您尝试过的代码,所以我们知道什么花费了太多时间。其他地方有重复的帖子。请检查此链接,看看这是否有帮助。 ***.com/questions/14476415/reshape-an-array-in-numpy 【参考方案1】:

使用numpy.hsplit 和numpy.concatenate:-

>>> a = np.random.randint(10, size= (5, 4))
>>> a
array([[8, 5, 8, 9],
       [9, 5, 6, 3],
       [5, 3, 8, 7],
       [9, 0, 9, 9],
       [0, 7, 8, 0]])
>>> t = np.hsplit(a, 2)
>>> t
[array([[8, 5],
       [9, 5],
       [5, 3],
       [9, 0],
       [0, 7]]), array([[8, 9],
       [6, 3],
       [8, 7],
       [9, 9],
       [8, 0]])]
>>> np.concatenate([t[0], t[1]])
array([[8, 5],
       [9, 5],
       [5, 3],
       [9, 0],
       [0, 7],
       [8, 9],
       [6, 3],
       [8, 7],
       [9, 9],
       [8, 0]])

【讨论】:

感谢您让我了解 np.hsplit!这很有帮助!【参考方案2】:

hsplitreshape 也可以使用

np.reshape(np.hsplit(a, 2), (-1,2))

Out[99]:
array([[1, 4],
       [3, 1],
       [4, 8],
       [8, 1],
       [6, 4],
       [5, 0],
       [5, 1],
       [0, 9],
       [5, 8],
       [7, 4]])

【讨论】:

【参考方案3】:

这可以通过重塑和转置(以及最终的重塑)来完成

In [195]: arr = np.arange(20).reshape(5,4)                                                                   
In [196]: arr                                                                                                
Out[196]: 
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15],
       [16, 17, 18, 19]])
In [197]: arr.reshape(5,2,2)                                                                                 
Out[197]: 
array([[[ 0,  1],
        [ 2,  3]],

       [[ 4,  5],
        [ 6,  7]],

       [[ 8,  9],
        [10, 11]],

       [[12, 13],
        [14, 15]],

       [[16, 17],
        [18, 19]]])
In [198]: arr.reshape(5,2,2).transpose(1,0,2)                                                                
Out[198]: 
array([[[ 0,  1],
        [ 4,  5],
        [ 8,  9],
        [12, 13],
        [16, 17]],

       [[ 2,  3],
        [ 6,  7],
        [10, 11],
        [14, 15],
        [18, 19]]])

识别正确的转置(或swapaxes)可能需要一些试验和错误。

In [199]: arr.reshape(5,2,2).transpose(1,0,2).reshape(-1,2)                                                  
Out[199]: 
array([[ 0,  1],
       [ 4,  5],
       [ 8,  9],
       [12, 13],
       [16, 17],
       [ 2,  3],
       [ 6,  7],
       [10, 11],
       [14, 15],
       [18, 19]])

拆分和连接的等价物:

In [200]: np.concatenate(np.hsplit(arr,2), axis=0)                                                           
Out[200]: 
array([[ 0,  1],
       [ 4,  5],
       [ 8,  9],
       [12, 13],
       [16, 17],
       [ 2,  3],
       [ 6,  7],
       [10, 11],
       [14, 15],
       [18, 19]])

转置路线应该更快。

【讨论】:

非常感谢您的评论!

以上是关于如何在 Python 中将一个数组中的多列堆叠在一起?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spark 中将数组分解为多列

如何在 Flutter 中将容器堆叠在键盘上,类似于聊天中的 WhatsApp“更多”部分

Flexbox:单列到堆叠的多列

如何在一列中将多个数据插入数据库[重复]

如何使用R将多列堆叠成一列[重复]

Python使用numpy中的hstack函数水平堆叠(horizontally stack)数组实战