处理数组的一项重要工作就是改变数组的维度,包括提高数组的维度和降低数组的维度,还包括数组的转置、拼接、分隔等。
Numpy为大家提供了大量的API可以很轻松的完成这些数组的操作。
1、改变数组的维度
如上篇文章使用到的reshape方法,将一维数组转化成多维数组;ravel方法或flatten方法将多维数组转化为一维数组。还可以直接设置ndarray的shape属性,通过resize方法也可以改变数组的维度。
例:
# 改变数组的维度
import numpy as np
# 创建一维数组
arr = np.arange(32)
print('arr:', arr)
print('arr的维度为', arr.shape)
# 使用reshape方法将一维数组转为多维数组
arr_mult = arr.reshape(4,2,4)
print('arr_mult:', arr_mult)
print('arr_mult的维度为', arr_mult.shape)
# 转为二维数组
arr_two = arr.reshape(4,8)
print('arr_two:', arr_two)
print('arr_two的维度为', arr_two.shape)
# 使用 ravel 函数将三维的 arr_mult 变成一维的数组
arr_one = arr_mult.ravel()
print('arr_one:', arr_one)
# 使用 flatten 函数将二维的 arr_two 变成一维的数组
arr_one1 = arr_two.flatten()
print('arr_one1:', arr_one1)
2、数组的拼接
数组的拼接分为水平拼接与垂直拼接。
对于一维或多维数组来说,水平拼接就是列拼接,改变列数不改变行数,垂直拼接就是就是行拼接,改变行数不改变列数。
需要注意的是:
1)水平拼接必须要满足一个条件,就是所有参与水平拼接的数组的行数必须相同,否则进行水平拼接会抛出异常。垂直拼接同理。
2)多维数组拼接时,需要相同类型的数组才可以拼接,否则会抛出异常。
(1)一维数组水平拼接
通过hstack函数可以将两个或多个数组水平拼接成一个数组
例:
import numpy as np
arr1 = np.arange(6).reshape(2,3)
print('arr1:', arr1)
arr2 = np.arange(6, 12).reshape(2,3)
print('arr2:', arr2)
arr_conca = np.hstack([arr1, arr2])
print('arr_conca:', arr_conca)
(2)一维数组垂直拼接
通过vstack函数可以将两个或多个数组垂直拼接成一个数组
例:
import numpy as np
arr1 = np.arange(6).reshape(2,3)
print('arr1:', arr1)
arr2 = np.arange(6, 12).reshape(2,3)
print('arr2:', arr2)
arr_conca = np.vstack([arr1, arr2])
print('arr_conca:', arr_conca)
(3)concatenate 函数
numpy还是提供了concatenate 函数用于沿指定轴拼接相同形状的多个数组,具体语法如下:
numpy.concatenate((a1, a2, ...), axis)
其中:参数a1,a2,...指相同类型的数组;axis指沿着它连接数组的轴,默认为0(垂直方向)
例:
arr1 = np.arange(6).reshape(2,3)
print('arr1:', arr1)
arr2 = np.arange(6, 12).reshape(2,3)
print('arr2:', arr2)
arr_conca = np.concatenate([arr1, arr2])
print('arr_conca:', arr_conca)
arr_conca1 = np.concatenate([arr1, arr2],axis=0)
print('垂直拼接:', arr_conca1)
arr_conca2 = np.concatenate([arr1, arr2],axis=1)
print('水平拼接:', arr_conca2)
(4)多维数组的拼接
arr_thr1 = np.arange(24).reshape(2, 3, 4)
print('arr_thr1:', arr_thr1)
arr_thr2 = np.arange(8, 24).reshape(2, 2, 4)
print('arr_thr2:', arr_thr2)
arr_thr3 = np.arange(16).reshape(2, 2, 4)
print('arr_thr3:', arr_thr3)
print('三维数组水平拼接'.center(30, '-'))
arr_conca_h_thr = np.hstack([arr_thr1, arr_thr2])
print('三维数组水平拼接arr_conca_h_thr:', arr_conca_h_thr)
print('三维数组arr_conca_h_thr的形状:', arr_conca_h_thr.shape)
print('三维数组垂直拼接'.center(30, '-'))
arr_conca_v_thr = np.vstack([arr_thr2, arr_thr3])
print('三维数组垂直拼接arr_conca_v_thr:', arr_conca_v_thr)
print('三维数组arr_conca_v_thr的形状:', arr_conca_v_thr.shape)
print('三维数组水平拼接'.center(30, '-'))
arr_conca_h_thr1 = np.concatenate([arr_thr1, arr_thr2], axis=1)
print('三维数组水平拼接arr_conca_h_thr1:', arr_conca_h_thr1)
print('三维数组arr_conca_h_thr1的形状:', arr_conca_h_thr1.shape)
3、数组的分隔
分隔数组是拼接数组的逆过程,与拼接数组一样,分隔数组也分为水平分隔数组和垂直分隔数组。水平分隔数组与水平拼接数组对应。水平拼接数组是将两个或多个数组水平进行收尾相接,而水平分隔数组是将已经水平拼接到一起的数组再分开。
在numpy中,常常使用numpy.split函数指定分隔的轴来分割数组。
其语法格式如下:
numpy.split(array, indices_or_sections, axis)
其中:
array:被分隔的数组
indices_or_sections:如果是一个整数,就用该数平均切分,如果是一个数组,就为沿轴切分的位置(索引号)
axis:沿着哪个维度进行切分,默认为0, 横向切分;为1时,纵向切分
例:
分隔一维数组
# 数组分隔
x = np.arange(8)
# 传递整数进行分隔
arr = np.split(x, 4)
print('arr:', arr)
print('arr[0]:', arr[0])
print('arr[1]:', arr[1])
print('arr[2]:', arr[2])
print('arr[3]:', arr[3])
# 传递数组进行分隔
arr1 = np.split(x,[2,4])
print('arr1:', arr1)
分隔二维数组
# 二维数组分隔
x = np.arange(12).reshape(4, 3)
print('x:', x)
# 沿垂直方向,平均分隔
arr = np.split(x, 2, axis=0)
print('arr[0]:', arr[0])
print('arr[1]:', arr[1])
# 沿水平方向,按位置分隔
arr1 = np.split(x, [1], axis=1)
print('arr1:', arr1)
(1)水平分隔
numpy也单独提供了水平分隔与垂直分隔的函数,分别为hsplit()与vsplit()。话不多说,直接上代码。
x = np.arange(12).reshape(3, 4)
print('x:', x)
arr = np.hsplit(x, 2)
print('arr[0]:', arr[0])
print('arr[1]:', arr[1])
(2)垂直分隔
x = np.arange(12).reshape(4, 3)
print('x:', x)
arr = np.vsplit(x, [2])
print('arr[0]:', arr[0])
print('arr[1]:', arr[1])
arr1 = np.vsplit(x, [1, 3])
print('位置1的数组')
print(arr1[0])
print('位置3的数组')
print(arr1[1])