在对数组进行操作时,经常要改变数组的维度。在NumPy中,常用reshape函数改变数组的“形状”,也就是改变数组的维度,其参数为一个正整数元组,分别指定数组在每个维度上的大小,reshape函数在改变原始数据的形状的同时不改变原始数据的值。如果指定的维度和数组的元素数目不相吻合,函数将抛出异常,如代码 421所示。
代码 421 改变数组形状
In[44]: | arr = np.arange(12) #创建一维数组 print('创建的一维数组为:',arr) |
Out[44]: | 创建的一维数组为: [ 0 1 2 3 4 5 6 7 8 9 10 11] |
In[45]: | print('新的一维数组为:',arr.reshape(3,4)) #设置数组的形状 |
Out[45]: | 新的一维数组为: [[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11]] |
In[46]: | print('数组维度为:',arr.reshape(3,4).ndim) #查看数组维度 |
Out[46]: | 数组维度为: 2 |
在NumPy中可以使用ravel函数完成数组展平工作,如代码 422所示。
代码 422 使用ravel函数展平数组
In[47]: | arr = np.arange(12).reshape(3,4) print('创建的二维数组为:',arr) |
Out[47]: | 创建的二维数组为: [[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11]] |
In[48]: | print('数组展平后为:',arr.ravel()) |
Out[48]: | 数组展平后为: [ 0 1 2 3 4 5 6 7 8 9 10 11] |
flatten函数也可以完成数组展平工作,区别在于flatten函数可以选择横向或纵向展平,如代码 423所示。
In[49]: | print('数组展平为:',arr.flatten()) #横向展平 |
Out[49]: | 数组展平为: [ 0 1 2 3 4 5 6 7 8 9 10 11] |
In[50]: | print('数组展平为:',arr.flatten('F')) #纵向展平 |
Out[50]: | 数组展平为: [ 0 4 8 1 5 9 2 6 10 3 7 11] |
除了可以改变数组“形状”,NumPy也可以对数组进行组合,组合方向主要有横向组合与纵向组合,使用hstack函数,vstack函数以及concatenate函数来完成数组的组合,下面将对数组组合常用的函数进行介绍。
横向组合是将ndarray对象构成的元组作为参数,传给hstack函数,如代码 424所示。
代码 424 使用hstack函数实现数组横向组合
In[51]: | arr1 = np.arange(12).reshape(3,4) print('创建的数组1为:',arr1) |
Out[51]: | 创建的数组1为: [[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11]] |
In[52]: | arr2 = arr1*3 print('创建的数组2为:',arr2) |
Out[52]: | 创建的数组2为: [[ 0 3 6 9] [12 15 18 21] [24 27 30 33]] |
In[53]: | print('横向组合为:',np.hstack((arr1,arr2))) #hstack函数横向组合 |
Out[53]: | 横向组合为: [[ 0 1 2 3 0 3 6 9] [ 4 5 6 7 12 15 18 21] [ 8 9 10 11 24 27 30 33]] |
纵向组合同样是将ndarray对象构成的元组作为参数,只不过传给vstack函数,如代码 425的所示。
代码 425 使用vstack函数实现数组纵向组合
In[54]: | print('纵向组合为:',np.vstack((arr1,arr2))) #vstack函数纵向组合 |
Out[54]: | 纵向组合为: [[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11] [ 0 3 6 9] [12 15 18 21] [24 27 30 33]] |
concatenate函数也可以实现数组的横向纵向组合,其中axis=1时按照横轴合并,在参数axis = 0时按照纵轴合并,如代码 426所示。
In[55]: | print('横向组合为:',np.concatenate((arr1,arr2),axis = 1)) #concatenate函数横向组合 |
Out[55]: | 横向组合为: [[ 0 1 2 3 0 3 6 9] [ 4 5 6 7 12 15 18 21] [ 8 9 10 11 24 27 30 33]] |
In[56]: | print('纵向组合为:',np.concatenate((arr1,arr2),axis = 0)) #concatenate函数纵向组合 |
Out[56]: | 纵向组合为: [[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11] [ 0 3 6 9] [12 15 18 21] [24 27 30 33]] |
除此之外,还可以对数组进行分割,NumPy提供hsplit、vsplit、dsplit和split函数,可以将数组分割成相同大小的子数组,也可以指定原数组中需要分割的位置。
使用hsplit函数可以对数组进行横向分割,ndarray对象构成的元组作为参数,如代码 427所示。
代码 427 使用hsplit函数实现数组横向分割
In[57]: | arr = np.arange(16).reshape(4,4) print('创建的二维数组为:',arr) |
Out[57]: | 创建的二维数组为: [[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11] [12 13 14 15]] |
In[58]: | print('横向分割为:',np.hsplit(arr1, 2)) #hsplit函数横向分割 |
Out[58]: | 横向分割为: [array([[ 0, 1], [ 4, 5], [ 8, 9], [12, 13]]), array([[ 2, 3], [ 6, 7], [10, 11], [14, 15]])] |
使用vsplit函数可以对数组进行纵向分割,ndarray对象构成的元组作为参数,如代码 428所示。
代码 428 使用vsplit函数实现数组纵向分割
In[59]: | print('纵向分割为:',np.vsplit(arr, 2)) #vsplit函数纵向分割 |
Out[59]: | 纵向分割为: [array([[0, 1, 2, 3], [4, 5, 6, 7]]), array([[ 8, 9, 10, 11], [12, 13, 14, 15]])] |
split函数同样可以实现数组分割,在参数axis=1时,可以进行横向分割,在参数axis=0,可以进行纵向分割,如代码 429所示。
In[60]: | print('横向分割为:',np.split(arr, 2, axis=1)) #split函数横向分割 |
Out[60]: | 横向分割为: [array([[ 0, 1], [ 4, 5], [ 8, 9], [12, 13]]), array([[ 2, 3], [ 6, 7], [10, 11], [14, 15]])] |
In[61: | print('纵向分割为:',np.split(arr, 2, axis=0)) #split函数纵向分割 |
Out[61]: | 纵向分割为: [array([[0, 1, 2, 3], [4, 5, 6, 7]]), array([[ 8, 9, 10, 11], [12, 13, 14, 15]])] |