素材巴巴 > 程序开发 >

numpy中的数组拼接、数组合并方法总结

程序开发 2023-09-06 12:35:02

零. 维度和轴

在这里插入图片描述
Python中可以用numpy中的ndim和shape来分别查看维度,以及在对应维度上的长度。直观上可以根据符号“[ ]”的层数来判断,有m层即为m维,最外面1层对应axis0, 依次为axis1,axis2…

c = np.array([[[1,2,3], [4,5,6]]])
 c.ndim   # 3
 # 三维数组c.shape  # (1, 2, 3)
 # 在axis 0 上的长度为1,在axis 1上的长度为2, 在axis 2上的长度为3.
 # 或者可以理解为1层2行3列
 

一、append()

numpy.append(arr, values, axis=None)

1. 展平两个数组(Flattening Two Arrays)

arr1 = np.array([[1, 2], [3, 4]])
 arr2 = np.array([[10, 20], [30, 40]])# no axis provided, array elements will be flattened
 arr_flat = np.append(arr1, arr2)print(arr_flat)  # [ 1  2  3  4 10 20 30 40]
 

2. 沿轴合并(Merging Along Axis)

arr_merged = np.append([arr1, arr2], axis=0)
 # 当 2×2 数组沿 x 轴合并时,输出数组大小为 4×2 
 Merged 2x2 Arrays along Axis-0:
 [[ 1  2][ 3  4][10 20][30 40]]arr_merged = np.append([arr1, arr2], axis=1)
 # 当 2×2 数组沿 y 轴合并时,输出数组大小为 2×4
 Merged 2x2 Arrays along Axis-1:
 [[ 1  2 10 20][ 3  4 30 40]]
 

二、concatenate

concatenate(a_tuple, axis=0, out=None)

arr1 = np.array([[1,2,3], [4,5,6]]) # shape: (2, 3)
 arr2 = np.array([[7,8,9], [11,12,13]])np.concatenate((arr1, arr2)) # axis=0
 array([[ 1, 2, 3],[ 4, 5, 6],[ 7, 8, 9],[11, 12, 13]])np.concatenate((arr1, arr2),axis=1)  # 这里沿第二个轴,即列方向进行拼接
 array([[ 1, 2, 3, 7, 8, 9],[ 4, 5, 6, 11, 12, 13]])arr3 = np.array([[14,15,16]]) # shape: (1, 3)
 # 一般进行 concatenate 操作的 array 的 shape 需要一致
 # 但如果 array 在拼接 axis 方向的 size 不一样,也可以完成
 # arr3 虽然在 axis_0 方向的长度不一致,但 axis1 方向上一致,所以沿 axis_0 可以拼接
 np.concatenate((arr1, arr3))  # √
 array([[ 1, 2, 3],[ 4, 5, 6],[14, 15, 16]])# arr3 和 arr1 在 axis_0 方向的长度不一致,报错
 np.concatenate((arr1, arr3), axis=1)  
 

三、hstack, vstack

np.hstack((arr1,arr2))  # 水平拼接,沿着行的方向,对列进行拼接
 array([[ 1, 2, 3, 7, 8, 9],[ 4, 5, 6, 11, 12, 13]])np.vstack((arr1,arr2))  # 垂直拼接,沿着列的方向,对行进行拼接
 array([[ 1, 2, 3],[ 4, 5, 6],[ 7, 8, 9],[11, 12, 13]])
 

四、column_stack, row_stack

np.column_stack((arr1,arr2))  # 水平拼接,沿着行的方向,对列进行拼接
 array([[ 1, 2, 3, 7, 8, 9],[ 4, 5, 6, 11, 12, 13]])np.row_stack((arr1,arr2))  # 垂直拼接,沿着列的方向,对行进行拼接
 array([[ 1, 2, 3],[ 4, 5, 6],[ 7, 8, 9],[11, 12, 13]])
 

五、 np.r_, np.c_

np.r_[arr1,arr2]   # 垂直拼接,沿着列的方向,对行进行拼接
 array([[ 1, 2, 3],[ 4, 5, 6],[ 7, 8, 9],[11, 12, 13]])np.c_[arr1,arr2]  # 水平拼接,沿着行的方向,对列进行拼接
 array([[ 1, 2, 3, 7, 8, 9],[ 4, 5, 6, 11, 12, 13]])
 

六、总结

方法拼接方式concatenate提供了axis参数,用于指定拼接方向append默认先ravel再拼接成一维数组,也可指定axishstack水平拼接,沿着行的方向,对列进行拼接vstack垂直拼接,沿着列的方向,对行进行拼接column_stack水平拼接,沿着行的方向,对列进行拼接row_stack垂直拼接,沿着列的方向,对行进行拼接r_垂直拼接,沿着列的方向,对行进行拼接c_水平拼接,沿着行的方向,对列进行拼接

对于两个shape一样的二维array来说:
增加行(对行进行拼接)的方法有:

array([[ 1, 2, 3],[ 4, 5, 6],[ 7, 8, 9],[11, 12, 13]])
 np.concatenate((ar1, ar2),axis=0)
 np.append(ar1, ar2, axis=0)
 np.vstack((ar1,ar2))
 np.row_stack((ar1,ar2))
 np.r_[ar1,ar2]
 

增加列(对列进行拼接)的方法有:

array([[ 1, 2, 3, 7, 8, 9],[ 4, 5, 6, 11, 12, 13]])
 np.concatenate((ar1, ar2),axis=1)
 np.append(ar1, ar2, axis=1)
 np.hstack((ar1,ar2))
 np.column_stack((ar1,ar2))
 np.c_[ar1,ar2]    
 

参考

https://www.numpy.org.cn/reference/routines/array-manipulation.html#%E7%BB%84%E5%90%88%E6%95%B0%E7%BB%84
https://www.jb51.net/article/161997.htm
https://blog.csdn.net/u011913417/article/details/106904183


标签:

上一篇: Angular - 目录结构 下一篇:
素材巴巴 Copyright © 2013-2021 http://www.sucaibaba.com/. Some Rights Reserved. 备案号:备案中。