用Python进行AI数据分析进阶教程20:NumPy数组的运算
NumPy数组的运算,是让数据真正“动起来”的核心操作。无论是加减乘除等算术运算,还是逻辑判断与大小比较,NumPy都提供了一套高效且简洁的实现方案。本教程将系统梳理这些运算细节,并重点解析备受关注且功能强大的广播机制。
一、NumPy数组运算的核心概念
首先明确几个基础定义。
算术运算:指数组间的加、减、乘、除、幂等基本数学操作。这些操作既可作用于两个数组之间,也可在数组与单个数值(标量)之间执行。
逻辑运算:对数组中每个元素执行逻辑判断,包括与(&)、或(|)、非(~)。运算结果仍为布尔数组。
比较运算:比较两个数组对应元素的大小关系,返回布尔值数组。常用运算符有等于(==)、不等于(!=)、大于(>)、小于(<)、大于等于(>=)、小于等于(<=)。
二、NumPy数组运算的关键机制
广播机制:这是NumPy的一大“核心优势”。当形状不同的数组进行运算时,NumPy会自动将较小的数组“扩展”成与较大数组相同的形状,再执行逐元素操作。例如,标量2与任意形状数组相加时,标量会被广播到数组的每个元素上;两个形状兼容的数组(如一维数组与二维数组,且一维长度与二维的某一维度匹配)也可通过广播顺利完成运算。
元素级运算:NumPy默认执行“元素对元素”的运算,即对应位置元素独立计算。这与矩阵乘法的整体规则不同,除非特意调用矩阵运算函数。
运算函数:NumPy提供了专用函数如np.add()、np.subtract()、np.multiply()、np.divide()。它们与运算符(+、-、*、/)功能基本一致,但支持更灵活的参数设置,且性能略有优化。
三、NumPy数组运算的注意事项
形状匹配:数组间运算时,需确保形状符合广播规则,或完全一致。若形状不匹配且无法广播,NumPy将抛出ValueError。
数据类型:运算结果的数据类型会依据参与数组的类型自动转换。例如,整数数组与浮点数数组相加,结果自动变为浮点数。
逻辑运算优先级:多个逻辑运算混用时,优先级顺序为:非(~)最高,与(&)次之,或(|)最低。不确定时建议使用括号明确顺序。
四、NumPy数组运算举例说明
1、算术运算实例
下面是一个基础示例:
import numpy as np
arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])
print(arr1 + arr2) # 输出 [5 7 9]
print(arr1 * 2) # 输出 [2 4 6]
print(np.subtract(arr2, arr1)) # 输出 [3 3 3]
观察可知,arr1 + arr2是对应位置元素相加,arr1 * 2则是每个元素乘以2——这正是标量广播的雏形。而np.subtract的作用与减号运算符完全一致。
2、逻辑运算实例
逻辑运算常用于条件筛选和掩码操作。先创建两个布尔数组:
import numpy as np
arr3 = np.array([True, False, True])
arr4 = np.array([False, True, True])
逻辑与:
print(arr3 & arr4) # 输出 [False False True]
只有两个位置均为True时,结果才为True。
逻辑或:
print(arr3 | arr4) # 输出 [ True True True]
只要有一个为True,结果即为True。
逻辑非:
print(~arr3) # 输出 [False True False]
将True转为False,False转为True,操作直观简洁。
3、比较运算实例
比较运算的结果也是布尔数组,常用于布尔索引:
import numpy as np
arr5 = np.array([10, 20, 30])
arr6 = np.array([10, 15, 30])
print(arr5 == arr6) # 输出 [ True False True]
print(arr5 > arr6) # 输出 [False True False]
4、广播机制示例
这是NumPy最精彩的特性之一。先看标量广播:
import numpy as np
arr7 = np.array([[1, 2, 3], [4, 5, 6]])
scalar = 2
print(arr7 + scalar)
# 输出:
# [[3 4 5]
# [6 7 8]]
标量2被自动广播到arr7的每个元素上,相当于每个元素都增加了2。
再看一维数组与二维数组的广播:
arr8 = np.array([1, 2, 3])
print(arr7 + arr8)
# 输出:
# [[2 4 6]
# [5 7 9]]
arr8为一维数组(长度为3),arr7为2×3的二维数组。广播机制自动将arr8沿行方向“复制”为2行,然后逐元素相加。当数组维度不同但某些维度长度一致时,这种操作极为高效,省去了手动编写循环的繁琐。
掌握这些运算技巧,你就能在数据分析中快速完成批量计算、条件筛选等常见任务。NumPy的强大之处,恰恰隐藏在这些看似简单的元素级运算与广播机制之中。
——The END——
