numpy(七)——数组拼接
import numpy as np
np.concatenate
concatenate((a1, a2, …), axis=0)
Join a sequence of arrays along an existing axis.
arr_x = np.array([1,2,3,4,5])
arr_y = np.array([2,3,4,5,6])
arr_xy = np.concatenate([arr_x,arr_y])
arr_xy
array([1, 2, 3, 4, 5, 2, 3, 4, 5, 6])
concatenate方法具有axis参数,但是仅适用于2维及以上的数组拼接。对于一维数组的拼接,那么结果仍旧是一维数组
arr_xy_axis1 = np.concatenate([arr_x,arr_y],axis=1)
---------------------------------------------------------------------------
AxisError Traceback (most recent call last)
<ipython-input-6-a7cba97e3a46> in <module>
----> 1 arr_xy_axis1 = np.concatenate([arr_x,arr_y],axis=1)
AxisError: axis 1 is out of bounds for array of dimension 1
arr_x_2d = np.arange(15).reshape(3,5)
arr_y_2d = np.arange(15,30).reshape(3,5)
print(arr_x_2d)
print("--"*10)
print(arr_y_2d)
[[ 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]]
对于2维数组,concatenate方法默认的拼接方向是沿着第0条轴的方向,也就是axis=0。
arr_xy_2d = np.concatenate([arr_x_2d,arr_y_2d])
arr_xy_2d
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]])
arr_xy_2d_axis1 = np.concatenate([arr_x_2d,arr_y_2d],axis=1)
arr_xy_2d_axis1
array([[ 0, 1, 2, 3, 4, 15, 16, 17, 18, 19],
[ 5, 6, 7, 8, 9, 20, 21, 22, 23, 24],
[10, 11, 12, 13, 14, 25, 26, 27, 28, 29]])
那么,拼接后的数组和原数组之间是什么关系呢?
arr_xy[0] = 999
print(arr_xy)
print("--"*10)
print(arr_x)
[999 2 3 4 5 2 3 4 5 6]
--------------------
[1 2 3 4 5]
vstack方法可以免去concatenate方法无法在垂直方向上进行数据拼接的尴尬境地。使用该方法,无论什么数组,都是按照垂直方向进行拼接。
arr_v = np.vstack([arr_x,arr_y])
arr_v
array([[1, 2, 3, 4, 5],
[2, 3, 4, 5, 6]])
arr_v_2d = np.vstack([arr_x_2d,arr_y_2d])
arr_v_2d
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]])
hstack的方法和vstack用法完全一致,不过hstack是在水平方向上进行拼接
arr_h = np.hstack([arr_x,arr_y])
arr_h
array([1, 2, 3, 4, 5, 2, 3, 4, 5, 6])
arr_h_2d = np.hstack([arr_x_2d,arr_y_2d])
arr_h_2d
array([[ 0, 1, 2, 3, 4, 15, 16, 17, 18, 19],
[ 5, 6, 7, 8, 9, 20, 21, 22, 23, 24],
[10, 11, 12, 13, 14, 25, 26, 27, 28, 29]])
至于拼接后的结果,返回的数组也是关于新数组的副本而非视图
arr_v[0,0] = 999
print(arr_v)
print("--"*10)
print(arr_x)
[[999 2 3 4 5]
[ 2 3 4 5 6]]
--------------------
[1 2 3 4 5]
arr_stack = np.stack([arr_x,arr_y],axis=0)
arr_stack
array([[1, 2, 3, 4, 5],
[2, 3, 4, 5, 6]])
arr_stack_axis1 = np.stack([arr_x,arr_y],axis=1)
arr_stack_axis1
array([[1, 2],
[2, 3],
[3, 4],
[4, 5],
[5, 6]])
arr_stack_2d = np.stack([arr_x_2d,arr_y_2d])
arr_stack_2d
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]]])
arr_stack_2d_axis1 = np.stack([arr_x_2d,arr_y_2d],axis=1)
arr_stack_2d_axis1
array([[[ 0, 1, 2, 3, 4],
[15, 16, 17, 18, 19]],
[[ 5, 6, 7, 8, 9],
[20, 21, 22, 23, 24]],
[[10, 11, 12, 13, 14],
[25, 26, 27, 28, 29]]])
-
可见,stack方法和vsatck,hsatck虽一字之差,可以意义和作用却大相径庭:
- 前三种拼接方法,拼接后的结果维度保持不变,两个一维的拼接,返回结果还是一维(当然,用vsatck拼接一维数组除外)。
- stack并非进行数组的拼接,而是进行数组的堆叠,因此,堆叠后的结果将造成返回数组的维度+1。
-
在返回结果上,则仍然是独立的副本
arr_stack[0,0] = 999
print(arr_x)
print("--"*10)
print(arr_stack)
[1 2 3 4 5]
--------------------
[[999 2 3 4 5]
[ 2 3 4 5 6]]