如何用Pythonic方式堆叠行数不同但列数相同的np.array?
问题描述
我有多个列数相同但行数不同的numpy数组:
a=np.array([[10, 20, 30], [40, 50, 60], [70, 80, 90]]) b=np.array([[1, 2, 3], [4, 5, 6]])
希望合并成如下结果:
result=np.array([[10, 20, 30], [40, 50, 60], [70, 80, 90], [1, 2, 3], [4, 5, 6]])
我目前用for循环实现,但觉得不够优雅,想找更Pythonic的实现方式。我的循环代码如下:
c=[a,b] num_row=sum([x.shape[0] for x in c]) num_col=a.shape[1] # 也可以用b.shape[1] result=np.zeros((num_row,num_col)) k=0 for s in c: for i in s: result[k]=i k+=1 # 输出结果 # array([[10, 20, 30], # [40, 50, 60], # [70, 80, 90], # [1, 2, 3], # [4, 5, 6]])
解决方案
直接用numpy内置的np.vstack()或者np.concatenate()就能高效实现,完全不需要手动写循环,这才是更Pythonic的做法:
方法1:使用np.vstack()
vstack专门用于垂直堆叠数组(按行合并),适合列数相同的数组:
import numpy as np a=np.array([[10, 20, 30], [40, 50, 60], [70, 80, 90]]) b=np.array([[1, 2, 3], [4, 5, 6]]) result = np.vstack((a, b)) print(result)
输出:
array([[10, 20, 30], [40, 50, 60], [70, 80, 90], [1, 2, 3], [4, 5, 6]])
方法2:使用np.concatenate()
通过指定axis=0参数实现垂直合并,和vstack效果一致,更通用(还能通过axis=1实现水平合并):
result = np.concatenate((a, b), axis=0) print(result)
输出和上面完全相同。
如果有多个数组要合并,直接把它们放进元组或列表里传入即可,比如合并三个数组np.vstack((a, b, c))。这些内置函数都是numpy底层优化过的,比手动循环效率高得多,尤其是处理大数据量的时候优势更明显。
内容的提问来源于stack exchange,提问作者doubleE
相关产品推荐
相关产品推荐

