NumPy基础入门:创建和管理多维数组
简介
NumPy(Numerical Python的简称)是Python语言的一个基础科学计算库,广泛应用于数据分析、机器学习、科学计算和工程领域。NumPy的核心是其强大的N维数组对象ndarray
,它为Python提供了一种类似于C语言中数组的数据结构,但比Python原生的列表(list)更高效、功能更丰富。
NumPy数组不仅可以实现高效的数值存储,还能进行快速的数值计算。NumPy提供了大量的数学函数库,包括线性代数、傅里叶变换和随机数生成等,这些功能在数据处理和科学计算中非常实用。
NumPy的数组结构是多维的,这意味着它可以存储和操作一维向量、二维矩阵以及更高维度的数据集。NumPy的数组是同质的,即数组中的所有元素必须是相同的数据类型,这使得NumPy能够以高度优化的方式实现数组操作。
NumPy的性能优势主要来自于其底层使用C语言编写,以及对数组操作的高度优化。NumPy的数组操作通常比纯Python实现快得多,这是因为NumPy的数组操作是直接在内存上进行的,而不需要像Python列表那样进行大量的函数调用。
此外,NumPy还是许多其他科学计算和数据分析库的基础,如Pandas、SciPy、Matplotlib和TensorFlow等,这些库在处理复杂数学运算、数据清洗、可视化和机器学习等方面发挥着重要作用。
NumPy安装与导入
在开始使用NumPy之前,请确保已经安装了这个库。如果未安装,可以通过Python的包管理工具pip来安装:
pip install numpy
安装完成后,就可以在Python脚本中导入NumPy库,并习惯性地将其简写为np
:
import numpy as np
print(np.__version__) # 输出NumPy版本信息,例如:1.18.5
N维数组类ndarray
ndarray
是NumPy库中最基本的数据结构,它是一个多维数组,可以看作是一个具有额外属性(如形状、数据类型等)的固定类型数据的集合。ndarray
对象支持广泛的算术运算,包括逐元素的加法、减法、乘法和除法等。
创建NumPy数组
创建NumPy数组非常简单,可以通过np.array
函数将Python的列表或元组转换成NumPy数组。例如:
arr1 = np.array([1, 2, 3, 4, 5]) # 创建一维数组
print(arr1) # 输出:[1 2 3 4 5]
arr2 = np.array([[1, 2, 3], [4, 5, 6]]) # 创建二维数组
print(arr2) # 输出:# [[1 2 3]# [4 5 6]]
NumPy数组属性
NumPy数组对象提供了若干属性,帮助我们更好地了解和操作数组:
ndim
:数组的维数。shape
:数组的形状,表示为一个元组,如(3, 4)
表示三行四列。size
:数组的总元素个数。dtype
:数组元素的数据类型。itemsize
:数组每个元素的大小(字节数)。
例如:
arr = np.array([[1, 2, 3], [4, 5, 6]])
print('ndim:', arr.ndim) # 输出数组的维数:2
print('shape:', arr.shape) # 输出数组的形状:(2, 3)
print('size:', arr.size) # 输出数组的总元素个数:6
print('dtype:', arr.dtype) # 输出数组元素的数据类型:int64
print('itemsize:', arr.itemsize) # 输出数组每个元素的大小:4(字节)
改变数组形状
reshape
方法允许我们在不改变数据的情况下改变数组的形状。例如,将一维数组重塑为二维数组:
arr = np.arange(12) # 创建0到11的一维数组
arr_reshaped = arr.reshape((4, 3)) # 将数组重塑为4行3列的二维数组
print(arr_reshaped) # 输出:# [[ 0 1 2]# [ 3 4 5]# [ 6 7 8]# [ 9 10 11]]
创建特定类型的数组
NumPy提供了一系列函数来创建特定类型的数组:
创建特定类型的数组
NumPy提供了多种函数,使得创建特定类型的数组变得简单快捷。以下是一些常用的数组创建函数及其示例。
np.arange
np.arange
函数可以从指定的起始值start
开始,到结束值stop
之前结束(不包括stop
),以给定的步长step
进行递增。如果不指定step
,默认步长为1。
# 使用arange创建0到11的一维数组
arr_arange = np.arange(12)
print(arr_arange) # 输出:[ 0 1 2 3 4 5 6 7 8 9 10 11]
np.linspace
np.linspace
函数在指定的起始值start
和结束值stop
之间创建num
个元素的等差数列。默认情况下,endpoint
参数为True
,意味着包含结束值stop
。
# 使用linspace创建0到10之间的5个点的等差数列
arr_linspace = np.linspace(0, 10, 5)
print(arr_linspace) # 输出:[0. 2.5 5. 7.5 10.]
np.logspace
np.logspace
函数在对数尺度上创建等比数列,即10**start
和10**stop
之间创建num
个元素。这对于对数数据的表示非常有用。
# 使用logspace创建1到10000之间的5个点的等比数列
arr_logspace = np.logspace(1, 5, 5)
print(arr_logspace) # 输出:[ 10. 100. 1000. 10000. 100000.]
np.zeros
np.zeros
函数创建一个指定形状shape
的数组,并将所有元素初始化为0。
# 创建一个形状为3行4列的全0数组
arr_zeros = np.zeros((3, 4))
print(arr_zeros) # 输出:# [[0. 0. 0. 0.]# [0. 0. 0. 0.]# [0. 0. 0. 0.]]
np.ones
np.ones
函数创建一个指定形状shape
的数组,并将所有元素初始化为1。
# 创建一个形状为2行2列的全1数组
arr_ones = np.ones((2, 2))
print(arr_ones) # 输出:# [[1. 1.]# [1. 1.]]
np.empty
np.empty
函数创建一个指定形状shape
的数组,数组的元素不会被初始化,因此内容是未定义的。
# 创建一个形状为3行2列的未初始化数组
arr_empty = np.empty((3, 2))
print(arr_empty) # 输出:数组,内容是未定义的(可能是任意值)
np.eye
np.eye
函数创建一个二维数组,其中对角线元素设置为1,其余元素为0。可选参数k
表示对角线的位置。
# 创建一个3行3列的单位矩阵,对角线右移一个单位
arr_eye = np.eye(3, k=1)
print(arr_eye) # 输出:# [[0. 1. 0.]# [0. 0. 1.]# [0. 0. 0.]]
np.diag
np.diag
函数有两种用法:当输入为一维数组v
时,它可以创建一个对角线元素为v
的方阵;当输入为二维数组时,它可以提取或返回数组的主对角线元素。
# 使用diag从一维数组创建方阵
arr_diag = np.diag([1, 2, 3])
print(arr_diag) # 输出:# [[1 0 0]# [0 2 0]# [0 0 3]]
通过这些函数,我们可以快速创建所需的数组类型,为数据分析和科学计算打下基础。
结论
本教程详细介绍了NumPy的基础知识,包括如何创建和管理多维数组。通过实际的例子,我们看到了如何利用NumPy的强大功能来简化数组操作。理解这些基础概念对于后续进行更高级的数值计算和数据分析至关重要。NumPy不仅提供了数组创建和管理的方法,还为科学计算和数据分析提供了坚实的基础。