NumPy 在数值计算方面表现出色的主要原因之一,在于它能够对数据执行批量操作,而无需使用 Python for 循环。这些操作是按元素应用的,这意味着操作是独立地对数组中每个对应的元素执行的。我们从基本算术开始:加法、减法、乘法和除法。当您在 NumPy 数组上使用标准算术运算符(+、-、*、/)时,NumPy 会自动将操作应用到每个元素。数组间的算术运算如果您有两个相同形状的数组,可以直接在它们之间执行算术运算。操作将按元素应用。考虑两个简单数组:import numpy as np arr1 = np.array([1, 2, 3, 4]) arr2 = np.array([10, 20, 30, 40]) print(f"arr1: {arr1}") print(f"arr2: {arr2}")输出:arr1: [1 2 3 4] arr2: [10 20 30 40]现在,我们执行一些算术运算:加法:sum_arr = arr1 + arr2 print(f"arr1 + arr2: {sum_arr}")输出:arr1 + arr2: [11 22 33 44]这里,arr1 的第一个元素 (1) 与 arr2 的第一个元素 (10) 相加,arr1 的第二个元素 (2) 与 arr2 的第二个元素 (20) 相加,依此类推。减法:diff_arr = arr2 - arr1 print(f"arr2 - arr1: {diff_arr}")输出:arr2 - arr1: [ 9 18 27 36]乘法:prod_arr = arr1 * arr2 print(f"arr1 * arr2: {prod_arr}")输出:arr1 * arr2: [ 10 40 90 160]注意: 这是按元素乘法,而非矩阵乘法。对于矩阵乘法,您将使用 @ 运算符或 np.dot() 函数。除法:div_arr = arr2 / arr1 print(f"arr2 / arr1: {div_arr}")输出:arr2 / arr1: [10. 10. 10. 10.]请注意,即使 arr1 和 arr2 包含整数,除法结果也是浮点数。NumPy 通常会将除法结果提升为浮点类型以保持精度。这些操作对于多维数组也类似地起作用,只要它们的形状匹配:mat1 = np.array([[1, 2], [3, 4]]) mat2 = np.array([[5, 6], [7, 8]]) print(f"mat1:\n{mat1}\n") print(f"mat2:\n{mat2}\n") prod_mat = mat1 * mat2 print(f"mat1 * mat2:\n{prod_mat}")输出:mat1: [[1 2] [3 4]] mat2: [[5 6] [7 8]] mat1 * mat2: [[ 5 12] [21 32]]数组与标量间的算术运算NumPy 也允许您在数组和单个数字(标量)之间执行算术运算。在这种情况下,NumPy 会将操作应用于标量与数组中的每个元素之间。这是一种简单的广播形式,我们稍后会更正式地介绍这个。arr = np.array([1, 2, 3, 4]) scalar = 10 print(f"Array: {arr}") print(f"Scalar: {scalar}\n") add_scalar = arr + scalar print(f"arr + scalar: {add_scalar}") mul_scalar = arr * scalar print(f"arr * scalar: {mul_scalar}") pow_scalar = arr ** 2 # 按元素平方 print(f"arr ** 2: {pow_scalar}")输出:Array: [1 2 3 4] Scalar: 10 arr + scalar: [11 12 13 14] arr * scalar: [10 20 30 40] arr ** 2: [ 1 4 9 16]操作会创建新数组务必记住,对 NumPy 数组执行算术运算会生成包含结果的新数组。原始数组保持不变。arr_a = np.array([5, 10, 15]) arr_b = np.array([1, 2, 3]) print(f"Original arr_a: {arr_a}") print(f"Original arr_b: {arr_b}\n") result = arr_a / arr_b print(f"Result of division: {result}") print(f"arr_a after division: {arr_a}") # 未改变 print(f"arr_b after division: {arr_b}") # 未改变输出:Original arr_a: [ 5 10 15] Original arr_b: [1 2 3] Result of division: [5. 5. 5.] arr_a after division: [ 5 10 15] arr_b after division: [1 2 3]如果您想就地修改数组,可以使用增广赋值运算符,如 +=、-=、*=、/=,尽管这不太常见,并且需要仔细考虑,特别是在数据类型方面。arr_a = np.array([5.0, 10.0, 15.0]) # 使用浮点数以避免除法引起的类型问题 arr_b = np.array([1.0, 2.0, 3.0]) print(f"arr_a before in-place division: {arr_a}") arr_a /= arr_b # 就地修改 arr_a print(f"arr_a after in-place division: {arr_a}")输出:arr_a before in-place division: [ 5. 10. 15.] arr_a after in-place division: [5. 5. 5.]这些基本算术运算是 NumPy 数值计算的根本。它们的按元素应用以及与标量一起工作的能力,与在 Python 中编写显式循环相比,提供了一种简洁高效的计算方法。接下来,我们将介绍通用函数 (ufuncs),它们在此功能的基础上,支持更广范围的数学运算。