【Python】使用NumPy处理数组以及常用函数总结
NumPy(Numerical Python的简称)是一个用于处理数组(特别是多维数组)和矩阵运算的Python库,同时也提供了大量的高级数学函数来操作这些数组。NumPy构建在Python之上,为Python提供了大量的数学计算功能,并极大地提升了Python在执行大量数学计算和数组操作时的性能和效率。
文章目录
一、什么是NumPy
NumPy(Numerical Python的简称)是一个用于处理数组(特别是多维数组)和矩阵运算的Python库,同时也提供了大量的高级数学函数来操作这些数组。NumPy构建在Python之上,为Python提供了大量的数学计算功能,并极大地提升了Python在执行大量数学计算和数组操作时的性能和效率。
1、主要特点
-
强大的N维数组对象:NumPy定义了一个强大的N维数组对象,称为
ndarray
。这个对象是一个快速、灵活的大数据容器,可以存储大量的数据,并且提供了方便的数据操作方法。 -
高效的性能:NumPy的内部实现使用了C语言,这使得其在进行大量数值计算时,性能远高于纯Python实现。NumPy数组在内存中是以连续块的形式存储的,这也有助于提高数据处理的效率。
-
广播功能:NumPy的广播功能允许对不同形状的数组进行数学运算,而无需进行额外的数据复制。这一特性在处理不同维度的数据时非常有用。
-
丰富的函数库:NumPy提供了大量的函数来处理数组,包括但不限于数学函数(如sin、cos、exp等)、统计函数(如mean、std、var等)、排序函数以及线性代数函数等。
-
与Python生态的集成:NumPy与Python的其他科学计算库(如SciPy、Pandas、Matplotlib等)紧密集成,可以方便地进行数据处理、科学计算和可视化。
-
易用性和灵活性:NumPy的API设计得非常直观和易用,用户可以轻松地执行复杂的数组操作和数学计算。同时,NumPy也支持自定义的数据类型,为用户提供了极大的灵活性。
2、主要功能
-
数组创建和操作:NumPy提供了多种方式来创建数组,如通过列表、元组等Python原生数据结构,或者直接使用NumPy的函数(如
numpy.zeros
、numpy.ones
等)。此外,NumPy还提供了丰富的数组操作功能,如切片、索引、形状变换等。 -
数学和逻辑运算:NumPy支持对数组进行各种数学运算(加、减、乘、除等)和逻辑运算(与、或、非等),这些操作都可以直接在数组上进行,而无需编写循环。
-
线性代数和统计功能:NumPy包含了大量的线性代数函数,如矩阵乘法、特征值分解等。同时,它也提供了丰富的统计函数,用于计算数组的均值、中位数、标准差等统计量。
-
随机数生成:NumPy包含了一个强大的随机数生成器,可以生成各种分布的随机数,如均匀分布、正态分布等。
-
与C/C++/Fortran代码的集成:NumPy提供了与C/C++/Fortran等语言的接口,使得用户可以在Python中调用这些语言编写的函数,从而进一步提高计算性能。
-
数据IO功能:NumPy支持从文件中读取和写入数据,包括文本文件和二进制文件,这为用户在处理大量数据时提供了便利。
二、常用函数
1、创建函数
在NumPy中,有多种函数可以用来创建数组。更多函数参考官网
这些函数提供了创建NumPy数组的不同方式,以满足各种数值计算需求。在实际应用中,可以根据具体的使用场景选择合适的创建函数。
以下是一些主要的NumPy数组创建函数及其详细介绍和示例:
-
numpy.array():将输入数据(列表、元组等)转换为NumPy ndarray对象
import numpy as np arr = np.array([1, 2, 3, 4]) print(arr) # 输出: [1 2 3 4]
-
numpy.zeros():创建一个全零的数组,形状由参数指定
import numpy as np zeros_arr = np.zeros((2, 3)) print(zeros_arr) # 输出: # [[0. 0. 0.] # [0. 0. 0.]]
-
numpy.ones():创建一个全一的数组,形状由参数指定
import numpy as np ones_arr = np.ones((2, 3)) print(ones_arr) # 输出: # [[1. 1. 1.] # [1. 1. 1.]]
-
numpy.empty():创建一个给定形状和类型的新数组,但不初始化数组的条目(即数组的内容是随机的,取决于内存的状态)
import numpy as np empty_arr = np.empty((2, 3)) print(empty_arr) # 输出内容可能是随机的,因为是未初始化的内存
-
numpy.eye():创建一个对角线为1,其余位置为0的二维数组(即单位矩阵)。
import numpy as np identity_matrix = np.eye(3) print(identity_matrix) # 输出: # [[1. 0. 0.] # [0. 1. 0.] # [0. 0. 1.]]
-
numpy.arange():返回在给定范围内的等差数组。
import numpy as np arange_arr = np.arange(5) print(arange_arr) # 输出: [0 1 2 3 4]
-
numpy.linspace():在指定的区间内返回均匀间隔的数字。
import numpy as np linspace_arr = np.linspace(0, 10, 5) print(linspace_arr) # 输出: [ 0. 2.5 5. 7.5 10. ]
-
numpy.fromfunction():通过函数来创建数组,函数会对每个索引调用一次,并使用返回的结果填充数组。
import numpy as np def f(x, y): return x + y func_arr = np.fromfunction(f, (3, 3), dtype=int) print(func_arr) # 输出: # [[0 1 2] # [1 2 3] # [2 3 4]]
-
numpy.full():创建一个给定形状和类型的新数组,并用指定的值填充。
import numpy as np full_arr = np.full((2, 3), 7) print(full_arr) # 输出: # [[7 7 7] # [7 7 7]]
2、数学运算
1)算术运算
NumPy支持基本的算术运算符,如加、减、乘、除等。这些运算符可以对NumPy数组进行元素级的操作。
- 加法:
numpy.add()
或使用运算符+
import numpy as np
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
c = np.add(a, b) # 或者 c = a + b
print(c) # 输出 [5 7 9]
- 减法:
numpy.subtract()
或使用运算符-
c = np.subtract(b, a) # 或者 c = b - a
print(c) # 输出 [3 3 3]
- 乘法:
numpy.multiply()
或使用运算符*
c = np.multiply(a, b) # 或者 c = a * b
print(c) # 输出 [4 10 18]
- 除法:
numpy.divide()
或使用运算符/
c = np.divide(b, a) # 或者 c = b / a
print(c) # 输出 [4. 2.5 2. ]
此外,NumPy还支持取模(numpy.mod()
或 %
)、取幂(numpy.power()
或 **
)以及取平方根(numpy.sqrt()
)等算术运算。
2)逻辑运算
NumPy提供了基本的逻辑运算符,用于对数组进行元素级的逻辑比较。这些运算符包括等于(==
)、不等于(!=
)、大于(>
)、小于(<
)、大于等于(>=
)、小于等于(<=
)等。例如:
c = (a > 2) # 返回一个布尔数组 [False False True]
3)统计运算
NumPy提供了大量的统计运算函数,用于计算数组的统计特性。这些函数包括求和(numpy.sum()
)、平均值(numpy.mean()
)、最大值(numpy.max()
)、最小值(numpy.min()
)、方差(numpy.var()
)和标准差(numpy.std()
)等。例如:
s = np.sum(a) # 计算数组a的和,输出6
m = np.mean(a) # 计算数组a的平均值,输出2.0
arr = np.array([1, 2, 3, 4])
std_dev = np.std(arr) # 输出: 1.118033988749895
4)线性代数运算
NumPy还提供了丰富的线性代数运算函数,如矩阵乘积(numpy.dot()
或 @
)、转置(numpy.transpose()
或 .T
)、逆矩阵(numpy.linalg.inv()
)等。这些函数使得NumPy在处理线性代数问题时非常高效。例如:
- numpy.dot():计算矩阵乘积
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
C = np.dot(A, B) # 或者 C = A @ B
print(C) # 输出 [[19 22] [43 50]]
-
numpy.linalg.det():计算矩阵的行列式
import numpy as np arr = np.array([[1, 2], [3, 4]]) det_val = np.linalg.det(arr) # 输出: -2.0
此外,NumPy还支持更多的数学运算和函数,如三角函数、指数函数、对数函数等。这些功能使得NumPy成为Python中进行科学计算和数据分析的强大工具。
3、其他函数
1)数组操作函数
-
numpy.reshape():改变数组的形状而不改变数据。
import numpy as np a = np.arange(6) # [0, 1, 2, 3, 4, 5] b = a.reshape(2, 3) print(b) # 输出: # [[0 1 2] # [3 4 5]]
-
numpy.concatenate():连接两个或多个数组。
import numpy as np a = np.array([[1, 2], [3, 4]]) b = np.array([[5, 6]]) c = np.concatenate((a, b), axis=0) print(c) # 输出: # [[1 2] # [3 4] # [5 6]]
-
numpy.sort():对数组进行排序
import numpy as np arr = np.array([3, 1, 4, 1, 5, 9]) sorted_arr = np.sort(arr); # 输出: [1 1 3 4 5 9]
-
numpy.copy():数组复制
import numpy as np # 创建一个NumPy数组 original_array = np.array([1, 2, 3, 4, 5]) # 使用numpy.copy()复制数组 copied_array = np.copy(original_array) # 修改原数组 original_array[0] = 100 # 输出原数组和复制后的数组 print("Original array:", original_array) print("Copied array:", copied_array) # Original array: [100 2 3 4 5] # Copied array: [1 2 3 4 5]
2)统计函数
-
numpy.median():计算数组的中位数。
import numpy as np a = np.array([1, 2, 3, 4, 5]) median = np.median(a) print(median) # 输出: 3.0
-
numpy.percentile():计算数组的百分位数。
import numpy as np a = np.array([1, 2, 3, 4, 5]) p50 = np.percentile(a, 50) # 计算50%百分位数,即中位数 print(p50) # 输出: 3.0
3)数组索引和切片函数
-
numpy.where():返回满足条件的元素的索引。
import numpy as np a = np.array([1, 2, 3, 4, 5, 6]) indices = np.where(a > 3) print(indices) # 输出满足条件的索引,例如: (array([3, 4, 5]),)
-
numpy.argmax() 和 numpy.argmin():分别返回数组中最大值和最小值的索引。
import numpy as np a = np.array([1, 2, 3, 0, 4, 5]) max_index = np.argmax(a) min_index = np.argmin(a) print(max_index) # 输出最大值5的索引: 5 print(min_index) # 输出最小值0的索引: 3
4)随机数生成
-
numpy.random.rand():生成0到1之间的随机数。
import numpy as np random_array = np.random.rand(3, 2) # 生成一个3x2的数组,元素值在0到1之间 print(random_array)
-
numpy.random.randint():生成指定范围内的随机整数。
import numpy as np random_ints = np.random.randint(0, 10, size=(2, 3)) # 生成一个2x3的数组,元素是0到9之间的随机整数 print(random_ints)
这些函数只是NumPy库功能的一小部分,但它们在数据分析和科学计算中非常常用。NumPy的强大之处在于它能够高效地处理大型多维数组和矩阵,并提供丰富的数学函数来操作这些数据。
三、数组的索引与切片
在NumPy中,数组的索引与切片是非常核心的操作,它们允许我们访问和修改数组中的特定元素或元素子集。
1、索引
在NumPy中,你可以通过索引来访问数组中的单个元素。索引是基于0的,这意味着第一个元素的索引是0,第二个元素的索引是1,依此类推。
例如:
import numpy as np
# 创建一个一维数组
arr = np.array([1, 2, 3, 4, 5])
# 访问数组中的第一个元素
print(arr[0]) # 输出: 1
# 访问数组中的第三个元素
print(arr[2]) # 输出: 3
对于多维数组,你需要使用逗号分隔的索引元组来访问元素。例如:
# 创建一个二维数组
arr_2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# 访问第一行第二列的元素
print(arr_2d[0, 1]) # 输出: 2
# 访问第二行第三列的元素
print(arr_2d[1, 2]) # 输出: 6
2、切片
切片允许你访问数组的一个子集,而不是单个元素。切片的基本语法是start:stop:step
,其中start
是切片的起始索引(包含),stop
是切片的结束索引(不包含),step
是切片的步长。
例如:
# 创建一个一维数组
arr = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
# 获取索引1到5(不包含5)之间的元素
print(arr[1:5]) # 输出: [2 3 4 5]
# 获取索引2到数组末尾的所有元素,步长为2
print(arr[2::2]) # 输出: [3 5 7 9]
对于多维数组,你可以使用逗号分隔的切片来访问子集。例如:
# 创建一个二维数组
arr_2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# 获取第一列的所有元素
print(arr_2d[:, 0]) # 输出: [1 4 7]
# 获取第一行和第二行的前两列
print(arr_2d[:2, :2]) # 输出: [[1 2] [4 5]]
注意,切片操作返回的是原数组的一个视图(如果可能的话),这意味着修改切片中的元素也会修改原数组中的相应元素。如果你想要一个独立的副本而不是视图,可以使用copy()
方法。
参考
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)