引言
众所周知,numpy能作为python中最受欢迎的数据处理模块,脱离不了它最核心的部件——ndarray数组。那么,我们今天就来了解一下numpy中对ndarray的常用操作。
通过阅读本篇博客你可以:
1.掌握ndarray数组的切片和copy
2.学会如何改变ndarray的数组维度
3.掌握数组的拼接
一、ndarray数组的切片和copy
1.ndarray数组的切片
ndarray对象的内容可以通过索引或切片来访问和修改,与Python中的list的切片操作一样。ndarray数组可以基于0-n的下标进行索引,并设置start,stop,step参数,从原数组中切割出一个新数组。
代码示例如下:
import numpy as np
# 一维数组切片和索引的使用
x = np.arange(10)
print(x) # [0 1 2 3 4 5 6 7 8 9]
y = x[2:9:2]
print(y) # [2 4 6 8]
z = x[2:]
print(z) # [2 3 4 5 6 7 8 9]
2.copy()
numpy.copy()可以用来复制ndarray数组。这个时候就有人要问了:“我们直接用切片或者说直接赋值给一个新变量来获取原数组不也同样可以做到复制的效果吗?”
这就是我们要讲的copy()和普通切片赋值操作的区别。我们直接看下面的代码示例
import numpy as np
# 直接切片赋值
arr = np.arange(10)
temp = arr[:3]
temp[0] = 100
print(arr) # [100 1 2 3 4 5 6 7 8 9]
# copy()复制
arr = np.arange(10)
temp = np.copy(arr[:3])
temp[0] = 100
print(arr) # [0 1 2 3 4 5 6 7 8 9]
从上述的代码我们能看出来,直接切片赋值得到的temp变量,在改变了0索引之后,原数组arr也改变了0索引的值。而copy()复制得到的temp变量,在改变了0索引之后,原数组arr并没有改变0索引的值。这是由于直接切片赋值得到的temp变量与原数组arr共享同一块内存,属于浅拷贝。而copy()复制的temp变量是一个新的数组,属于深拷贝。
结论:
①直接切片赋值对切片的修改会影响原始数组
②copy()复制对副本的修改不会影响原始数组
二、ndarray数组的维度改变
处理数组的一项重要工作就是改变数组的维度,包含提升数组的维度和降低数组的维度。numpy中封装了大量的方法用来改变数组的维度。
1.reshape()
使用numpy.reshape()函数,你可以将一个数组的形状转变为另一个形状,而不改变数组中的数据。
代码示例如下:
import numpy as np
# 将一维数组改为 2 * 5 的二维数组
arr = np.arange(10)
res = arr.reshape(2, 5)
print(res)
"""[[0 1 2 3 4]
[5 6 7 8 9]]
"""
2.ravel()
numpy.ravel()可以将多维ndarray数组转换成一维数组。
代码示例如下:
import numpy as np
# 创建一个二维数组
arr = np.array([[1, 2, 3], [4, 5, 6]])
print(arr)
"""[[1 2 3]
[4 5 6]]
"""
# 使用 ravel() 展平数组
flattened_arr = arr.ravel()
print(flattened_arr) # [1 2 3 4 5 6]
3.flatten()
numpy.flatten()函数同numpy.ravel()一样可以将多维数组展平为一维数组。但是numpy.flatten()会返回一个展平后的副本,如果修改副本不会影响原数组。但numpy.ravel()是返回一个视图,修改展平后的视图会影响到原数组。
代码示例如下:
import numpy as np
# 创建一个二维数组
arr = np.array([[1, 2, 3], [4, 5, 6]])
print(arr)
"""[[1 2 3]
[4 5 6]]
"""
# 使用 flatten() 展平数组
flattened_arr = arr.flatten()
print(flattened_arr) # [1 2 3 4 5 6]
三、ndarray数组的拼接
1.水平数组的组合
hstack()
numpy.hstack()函数用于多维数组的水平拼接,在拼接数组时沿着第一个轴(即横轴)进行操作,因此适用于二维数组的列拼接,也可以用于更高维度数组的横向拼接。
代码示例如下:
import numpy as np
# 创建两个二维数组
arr1 = np.array([[1, 2, 3], [4, 5, 6]])
arr2 = np.array([[7, 8, 9], [10, 11, 12]])
# 使用 hstack() 进行水平拼接
result = np.hstack((arr1, arr2))
print(result)
"""[[ 1 2 3 7 8 9]
[ 4 5 6 10 11 12]]
"""
2.垂直数组的组合
vstack()
numpy.vstack()函数可以将多个数组沿着垂直方向拼接,在拼接数组时沿着第二个轴(即纵轴)进行操作,因此适用于二维数组的行拼接,也可以用于更高维度数组的纵向拼接。
代码示例如下:
import numpy as np
# 创建两个二维数组
arr1 = np.array([[1, 2, 3], [4, 5, 6]])
arr2 = np.array([[7, 8, 9], [10, 11, 12]])
# 使用 vstack() 进行垂直拼接
result = np.vstack((arr1, arr2))
print(result)
"""[[ 1 2 3]
[ 4 5 6]
[ 7 8 9]
[10 11 12]]
"""
3.通用的数组的拼接
concatenate()
import numpy as np
np.concatenate((a0,a1,...,an),axis)
numpy.concatenate()函数可用于水平组合也可用于垂直组合。具体使用哪个方向取决于参数axis。如果参数axis = 0,则是垂直拼接;如果参数axis = 1,则是水平拼接。
代码示例如下:
import numpy as np
# 创建三个二维数组
arr1 = np.array([[1, 2, 3], [4, 5, 6]])
arr2 = np.array([[7, 8, 9], [10, 11, 12]])
arr3 = np.array([[13, 14, 15], [16, 17, 18]])
# 沿着第一个轴(纵向)拼接
result_axis0 = np.concatenate((arr1, arr2, arr3), axis=0)
print(result_axis0)
"""[[ 1 2 3]
[ 4 5 6]
[ 7 8 9]
[10 11 12]
[13 14 15]
[16 17 18]]
"""
# 沿着第二个轴(横向)拼接
result_axis1 = np.concatenate((arr1, arr2, arr3), axis=1)
print(result_axis1)
"""[[ 1 2 3 7 8 9 13 14 15]
[ 4 5 6 10 11 12 16 17 18]]
"""
总结
本章博客介绍了numpy模块中多维数组的切片、维度的改变以及不同的拼接方法。希望可以对大家起到作用,谢谢。
关注我,内容持续更新(后续内容在作者专栏《从零基础到AI算法工程师》)!!!