上节课我们讲述了 ndarray 的索引、切片和遍历。 本节课我们来讲述 ndarray 的重塑、组合和拆分。
# 1.重塑
使用 numpy 提供的方法,我们可以改变 ndarray 的维度数,比如将一维的数组重塑成二维的数组,例如:
import numpy as np
my_arr1 = np.random.random(12)
print(my_arr1)
my_arr2 = my_arr1.reshape(3,4)
print(my_arr2)
print(my_arr1)
2
3
4
5
6
7
8
9
在上面的代码中,my_arr1
是一个含有 12 个元素的一维数组,我们使用 reshape()
函数将 my_arr1
重塑成一个 3 行 4 列的二维数组。这里有一点要注意的是,虽然我们对 my_arr1
调用了 reshape() 函数,但是 my_arr1
本身并没有发生改变,要想改变 my_arr1
,我们可以这样做:
import numpy as np
my_arr1 = np.random.random(12)
print(my_arr1)
my_arr1.shape = (3, 4)
print(my_arr1)
2
3
4
5
6
7
在上面的代码中,我们直接将 my_arr1
的 shape 属性修改为 (3, 4),这样的话,my_arr1
的形状就发生了改变。如果想把发生形状改变后的 my_arr1
重新改成一维数组,我们可以使用 ravel() 函数。
import numpy as np
my_arr1 = np.random.random(12)
print(my_arr1)
my_arr1.shape = (3, 4)
print(my_arr1)
my_arr1 = my_arr1.ravel()
print(my_arr1)
2
3
4
5
6
7
8
9
10
# 2.组合
上面讲述了 ndarray 的重塑,下面来讲下多个 ndarray 的组合。例如:
import numpy as np
my_arr1 = np.ones((3,3))
my_arr2 = np.zeros((4,3))
print(np.vstack((my_arr1, my_arr2)))
2
3
4
5
6
上面的代码将 my_arr1
和 my_arr2
按照垂直方向进行组合,在组合时需要注意的是,当我们按垂直方向组合两个 ndarray 时,两个 ndarray 的列数需要相等,否则会报错。既然可以按照垂直方向进行组合,相应地,我们也可以按照水平方向进行组合。例如:
import numpy as np
my_arr1 = np.ones((3,3))
my_arr2 = np.zeros((3,4))
print(np.hstack((my_arr1, my_arr2)))
2
3
4
5
6
上面的代码将 my_arr1
和 my_arr2
按照水平方向进行组合,在组合时需要注意的是,当我们按水平方向组合两个 ndarray 时,两个 ndarray 的行数需要相等,否则会报错。
上面按垂直方向组合两个 ndarray 时,我们还有另外一种实现方法,例如:
import numpy as np
my_arr1 = np.ones((3,3))
my_arr2 = np.zeros((4,3))
print(np.row_stack((my_arr1, my_arr2)))
2
3
4
5
6
上面代码中的 row_stack() 函数的效果和 vstack() 函数的效果是一样的,在进行组合时,同样要注意两个 ndarray 的列数需要相等,否则会报错。同样的,上面按水平方向组合两个 ndarray 时,我们同样有另外一种实现方法,例如:
import numpy as np
my_arr1 = np.ones((3,3))
my_arr2 = np.zeros((3,4))
print(np.column_stack((my_arr1, my_arr2)))
2
3
4
5
6
上面代码中的 column_stack() 函数的效果和 hstack() 函数的效果是一样的,在进行组合时,同样要注意两个 ndarray 的行数需要相等,否则会报错。上面讲的都是二维数组的组合,一维数组的组合是类似的,我们来举两个例子:
import numpy as np
my_arr1 = np.arange(0, 3)
my_arr2 = np.arange(3, 6)
my_arr3 = np.arange(6, 9)
print(np.row_stack((my_arr1, my_arr2, my_arr3)))
2
3
4
5
6
7
import numpy as np
my_arr1 = np.arange(0, 3)
my_arr2 = np.arange(3, 6)
my_arr3 = np.arange(6, 9)
print(np.column_stack((my_arr1, my_arr2, my_arr3)))
2
3
4
5
6
7
# 3.拆分
既然可以对 ndarray 进行组合,我们就可以对 ndarray 进行拆分。例如:
import numpy as np
my_arr1 = np.arange(0, 16).reshape((4, 4))
[my_arr2, my_arr3] = np.hsplit(my_arr1, 2)
print(my_arr2)
print(my_arr3)
2
3
4
5
6
7
上面的代码对 my_arr1
进行拆分,拆分成 2 个 ndarray,my_arr1
是一个 4 行 4 列的二维数组,拆分成了 2 个 4 行 2 列 的二维数组。hsplit() 函数进行的是水平方向的拆分,同样的,我们可以进行垂直方向的拆分,例如:
import numpy as np
my_arr1 = np.arange(0, 16).reshape((4, 4))
[my_arr2, my_arr3] = np.vsplit(my_arr1, 2)
print(my_arr2)
print(my_arr3)
2
3
4
5
6
7
上面的代码进行了水平方向的拆分,将 4 行 4 列的二维数组 my_arr1
拆分成 2 个 2 行 4 列的二维数组。上面进行的拆分是平分,更进一步我们可以指定拆分的位置。例如:
import numpy as np
my_arr1 = np.arange(0, 16).reshape((4, 4))
[my_arr2, my_arr3, my_arr4] = np.split(my_arr1, [1, 3], axis=1)
print(my_arr2)
print(my_arr3)
print(my_arr4)
2
3
4
5
6
7
8
上面代码指定的拆分位置为第 1 列和第 3 列,于是将一个 4 行 4 列的二维数组拆分成 3 个数组,分别是 4 行 1 列、4 行 2 列、4 行 1列。上面指定的是列的拆分位置,同样的,我们可以指定行的拆分位置,例如:
import numpy as np
my_arr1 = np.arange(0, 16).reshape((4, 4))
[my_arr2, my_arr3, my_arr4] = np.split(my_arr1, [1, 3], axis=0)
print(my_arr2)
print(my_arr3)
print(my_arr4)
2
3
4
5
6
7
8
上面代码指定的拆分位置为第 1 行和第 3 行,于是将一个 4 行 4 列的二维数组拆分成 3 个数组,分别是 1 行 4 列、2 行 4 列、1 行 4 列。
# 4.总结
# 5.练习题
使用 arange 函数创建两个 3*2 的 ndarray,并对这两个 ndarray 按照行的方向和列的方向进行堆叠。