Numpy 数组操作
Numpy 中包含了一些函数用于处理数组,本节重点介绍如下几类:
- 修改数组形状;
- 翻转数组;
- 格式转换。
1. 修改数组形状
常用的修改数组形状的函数有:
函数 | 说明 |
---|---|
reshape | 不改变数据的条件下修改形状 |
flat | 数组元素迭代器 |
flatten | 返回一份数组拷贝,对拷贝所做的修改不会影响原始数组 |
ravel | 返回展开数组 |
1.1 reshape
numpy.reshape 函数可以在不改变数据的条件下修改形状,其函数原型如下:
numpy.reshape(arr, newshape, order='C')
参数 | 说明 |
---|---|
arr | 待修改形状的数组 |
newshape | 整数或者整数数组,新的形状应当兼容原有形状 |
order | ‘C’ – 按行,‘F’ – 按列,‘A’ – 原顺序,‘k’ – 元素在内存中的出现顺序。 |
案例
生成一维数组,并利用 reshape 进行数组形状的重整:
arr0 = np.arange(8).reshape(2,4)
输出结果为:
array([[0, 1, 2, 3],
[4, 5, 6, 7]])
1.2 flat
numpy.ndarray.flat 是一个数组元素迭代器,可以利用for循环对迭代器进行遍历。
案例
查阅数组 arr0 中的元素
for element in arr0.flat:
print(element)
程序执行结果为:
0
1
2
3
4
5
6
7
1.3 flatten
numpy.ndarray.flatten返回一份数组拷贝,并折叠为一维的数组。对拷贝所做的修改不会影响原始数组,函数原型如下:
ndarray.flatten(order='C')
其中,order 可选:‘C’ – 按行,‘F’ – 按列,‘A’ – 原顺序,‘K’ – 元素在内存中的出现顺序。
案例
将数组 arr0 以特定顺序展开:
print("将arr0以行顺序展开:", arr0.flatten(order='C'))
print("将arr0以列顺序展开:", arr0.flatten(order='F'))
执行结果为:
将arr0以行顺序展开: [0 1 2 3 4 5 6 7]
将arr0以列顺序展开: [0 4 1 5 2 6 3 7]
1.4 ravel
numpy.ravel() 展平的数组元素,顺序通常是"C风格",返回的是数组视图(view),修改会影响原始数组。
该函数接收两个参数:
numpy.ravel(a, order='C')
其中,order 可选:‘C’ – 按行,‘F’ – 按列,‘A’ – 原顺序,‘K’ – 元素在内存中的出现顺序。
案例
arr_r = np.ravel(arr0, order='C')
展开结果为:
arr_r
out:
array([0, 1, 2, 3, 4, 5, 6, 7])
通过切片赋值的方法,显式地改变 arr_r 的值,查看 arr0 的变化:
arr_r[0] = 100
arr0
out:
array([[100, 1, 2, 3],
[ 4, 5, 6, 7]])
可以看到,虽然利用 ravel 方法对 arr0 进行了展开,但是对展开后的结果所做的修改,也会对应地出现在 arr0 上。
2. 翻转数组
numpy.transpose 函数用于对换数组的维度。
案例
调换 arr0 的数组维度,达到转置的效果:
np.transpose(arr0)
out:
array([[100, 4],
[ 1, 5],
[ 2, 6],
[ 3, 7]])
类似地,上述案例可以写为:
arr0.transpose()
out:
array([[100, 4],
[ 1, 5],
[ 2, 6],
[ 3, 7]])
或者:
arr0.T
out:
array([[100, 4],
[ 1, 5],
[ 2, 6],
[ 3, 7]])
3. 格式转换
借助于 tolist(),可以快速把 ndarray 格式的数组,转变为列表,方便在某些情况下使用。
案例
把 arr0 转化为列表:
arr0.tolist()
out:
[[100, 1, 2, 3], [4, 5, 6, 7]]
可以看到,对于二维数组,转化后的结果是一个两层嵌套列表。
4. 小结
本节重点介绍数组操作的三种方法:修改数组形状、翻转数组以及转化数组为列表。特别要注意的是ravel() 函数,返回的是原始数组的视图,对结果的修改会对应地体现在原始数组上。