NumPy入门:快速掌握Python数据分析利器
在数据科学和机器学习领域,Python已经成为最流行的编程语言之一。这很大程度上归功于其丰富的生态系统,其中NumPy库扮演着至关重要的角色。NumPy,即Numerical Python,是Python中用于科学计算的基础包。它提供了一个强大的N维数组对象、广播功能函数、集成C/C++和Fortran代码的工具以及线性代数、傅里叶变换和随机数生成等实用功能。
本文将深入介绍NumPy,帮助你快速掌握这个强大的数据分析利器。我们将从NumPy的核心概念开始,逐步探索其各种功能,并提供实用的代码示例,让你能够轻松地将NumPy应用到你的数据分析项目中。
一、NumPy的核心概念:ndarray
NumPy的核心是ndarray(N-dimensional array object),即N维数组对象。ndarray是一个存储相同类型数据的多维容器,可以是整数、浮点数、字符串等。与Python的列表相比,ndarray具有以下显著优势:
- 性能更高: NumPy数组使用连续的内存块存储数据,这使得其能够利用SIMD(Single Instruction, Multiple Data)指令进行并行计算,显著提升运算速度。
- 内存效率更高: 由于数据类型相同,NumPy数组可以更紧凑地存储数据,减少内存占用。
- 强大的广播机制: NumPy允许对不同形状的数组进行运算,只要它们满足一定的广播规则。
1.1 创建ndarray
NumPy提供了多种创建ndarray的方式:
-
从Python列表或元组创建: 使用
np.array()
函数可以将Python列表或元组转换为NumPy数组。“`python
import numpy as np从列表创建
list1 = [1, 2, 3, 4, 5]
arr1 = np.array(list1)
print(arr1) # 输出: [1 2 3 4 5]
print(type(arr1)) # 输出:从元组创建
tuple1 = (6, 7, 8, 9, 10)
arr2 = np.array(tuple1)
print(arr2) # 输出: [ 6 7 8 9 10]
“` -
使用NumPy内置函数创建: NumPy提供了许多内置函数,可以快速创建特定类型的数组。
-
np.zeros(shape)
:创建指定形状的零数组。“`python
arr3 = np.zeros((2, 3)) # 创建一个2行3列的零数组
print(arr3)输出:
[[0. 0. 0.]
[0. 0. 0.]]
“`
-
np.ones(shape)
:创建指定形状的全一数组。“`python
arr4 = np.ones((3, 2)) # 创建一个3行2列的全一数组
print(arr4)输出:
[[1. 1.]
[1. 1.]
[1. 1.]]
“`
-
np.empty(shape)
:创建指定形状的空数组(未初始化)。注意,空数组中的值是随机的,不应假定其为零。“`python
arr5 = np.empty((2, 2))
print(arr5)输出 (可能会是随机值):
[[6.93040926e-310 6.93040926e-310]
[6.93040926e-310 6.93040926e-310]]
“`
-
np.arange(start, stop, step)
:创建指定范围内的数组,类似于Python的range()
函数。python
arr6 = np.arange(0, 10, 2) # 创建一个从0到10(不包括10),步长为2的数组
print(arr6) # 输出: [0 2 4 6 8] -
np.linspace(start, stop, num)
:创建指定范围内的数组,并指定数组元素的个数。python
arr7 = np.linspace(0, 1, 5) # 创建一个从0到1(包括1),包含5个元素的数组
print(arr7) # 输出: [0. 0.25 0.5 0.75 1. ] -
np.eye(N)
:创建N x N的单位矩阵。“`python
arr8 = np.eye(3) # 创建一个3×3的单位矩阵
print(arr8)输出:
[[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]]
“`
-
1.2 ndarray的属性
ndarray对象具有许多有用的属性,可以帮助我们了解数组的结构和数据类型。
-
ndarray.ndim
:数组的维度数。python
arr = np.array([[1, 2, 3], [4, 5, 6]])
print(arr.ndim) # 输出: 2 -
ndarray.shape
:数组的形状,即每个维度的长度。python
print(arr.shape) # 输出: (2, 3) -
ndarray.size
:数组中元素的总个数。python
print(arr.size) # 输出: 6 -
ndarray.dtype
:数组中元素的数据类型。python
print(arr.dtype) # 输出: int64 (或int32,取决于你的系统) -
ndarray.itemsize
:数组中每个元素占用的字节数。python
print(arr.itemsize) # 输出: 8 (如果是int64) 或 4 (如果是int32)
1.3 ndarray的数据类型
NumPy支持多种数据类型,包括整数、浮点数、布尔值、字符串等。可以使用dtype
参数在创建数组时指定数据类型。
“`python
arr1 = np.array([1, 2, 3], dtype=np.int32)
print(arr1.dtype) # 输出: int32
arr2 = np.array([1.0, 2.0, 3.0], dtype=np.float64)
print(arr2.dtype) # 输出: float64
arr3 = np.array([True, False, True], dtype=np.bool_)
print(arr3.dtype) # 输出: bool
arr4 = np.array([‘apple’, ‘banana’, ‘cherry’], dtype=np.string_) # fixed-length byte strings
print(arr4.dtype) # 输出: |S6 (长度取决于元素中最长字符串的长度)
arr5 = np.array([‘apple’, ‘banana’, ‘cherry’], dtype=np.unicode_) # fixed-length unicode strings
print(arr5.dtype) # 输出: U6 (长度取决于元素中最长字符串的长度)
“`
可以使用astype()
方法更改数组的数据类型。
python
arr = np.array([1, 2, 3])
arr_float = arr.astype(np.float64)
print(arr_float.dtype) # 输出: float64
二、NumPy数组的索引和切片
NumPy数组的索引和切片与Python列表类似,但更加强大。
2.1 基本索引和切片
-
一维数组: 与Python列表相同。
python
arr = np.arange(10)
print(arr[0]) # 输出: 0
print(arr[2:5]) # 输出: [2 3 4]
print(arr[:]) # 输出: [0 1 2 3 4 5 6 7 8 9]
print(arr[5:]) # 输出: [5 6 7 8 9]
print(arr[:-1]) # 输出: [0 1 2 3 4 5 6 7 8] -
多维数组: 可以使用逗号分隔的索引来访问特定元素。
python
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(arr[0, 0]) # 输出: 1
print(arr[1, 2]) # 输出: 6可以使用切片来访问数组的子区域。
python
print(arr[:2, 1:]) # 输出: [[2 3] [5 6]]
print(arr[1:, :2]) # 输出: [[4 5] [7 8]]
2.2 布尔索引
布尔索引允许使用布尔数组来选择数组中的元素。
python
arr = np.array([1, 2, 3, 4, 5])
bool_arr = arr > 2
print(bool_arr) # 输出: [False False True True True]
print(arr[bool_arr]) # 输出: [3 4 5]
2.3 花式索引
花式索引允许使用整数数组来选择数组中的元素。
“`python
arr = np.array([1, 2, 3, 4, 5])
index_arr = [0, 2, 4]
print(arr[index_arr]) # 输出: [1 3 5]
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(arr[[0, 2], [1, 2]]) # 输出 [2 9] (选择了(0,1)和(2,2)位置的元素)
“`
三、NumPy的算术运算和通用函数(ufunc)
NumPy提供了丰富的算术运算和通用函数,可以对数组进行各种数学操作。
3.1 数组的算术运算
NumPy允许对数组进行逐元素的算术运算。
“`python
arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])
print(arr1 + arr2) # 输出: [5 7 9]
print(arr1 – arr2) # 输出: [-3 -3 -3]
print(arr1 * arr2) # 输出: [ 4 10 18]
print(arr1 / arr2) # 输出: [0.25 0.4 0.5 ]
print(arr1 ** arr2) # 输出: [ 1 32 729]
“`
3.2 通用函数(ufunc)
通用函数是对ndarray中的数据执行元素级运算的函数。 NumPy提供了许多内置的ufunc。
np.abs()
:计算绝对值。np.sqrt()
:计算平方根。np.exp()
:计算指数。np.log()
:计算自然对数。np.sin()
:计算正弦值。np.cos()
:计算余弦值。np.tan()
:计算正切值。np.floor()
: 向下取整np.ceil()
: 向上取整np.round()
: 四舍五入
“`python
arr = np.array([1, 4, 9])
print(np.sqrt(arr)) # 输出: [1. 2. 3.]
arr = np.array([-1, -2, -3, 1, 2, 3])
print(np.abs(arr)) # 输出: [1 2 3 1 2 3]
arr = np.array([1, 2, 3])
print(np.exp(arr)) # 输出: [ 2.71828183 7.3890561 20.08553692]
“`
四、NumPy的广播机制
广播是NumPy强大的特性之一,它允许对不同形状的数组进行运算,而无需显式地复制数据。广播的规则如下:
- 如果两个数组的维度数不同,则在维度数较小的数组的形状前面补1,直到维度数相同。
- 如果两个数组的形状在任何维度上都不匹配,则该维度的长度必须为1,才能进行广播。
- 如果两个数组在任何维度上的长度都不为1,且不相等,则无法进行广播。
“`python
arr1 = np.array([1, 2, 3])
arr2 = np.array([[4], [5], [6]])
print(arr1 + arr2)
输出:
[[5 6 7]
[6 7 8]
[7 8 9]]
“`
在这个例子中,arr1
的形状是(3,)
,arr2
的形状是(3, 1)
。arr1
被广播为(3, 3)
,arr2
也被广播为(3, 3)
,然后进行逐元素相加。
五、NumPy的线性代数
NumPy提供了强大的线性代数功能,包括矩阵乘法、矩阵分解、求逆等。
np.dot(a, b)
:计算矩阵乘法。np.linalg.inv(a)
:计算矩阵的逆。np.linalg.solve(a, b)
:解线性方程组。np.linalg.eig(a)
:计算矩阵的特征值和特征向量。np.linalg.det(a)
:计算矩阵的行列式。
“`python
arr1 = np.array([[1, 2], [3, 4]])
arr2 = np.array([[5, 6], [7, 8]])
矩阵乘法
print(np.dot(arr1, arr2))
输出:
[[19 22]
[43 50]]
矩阵的逆
arr = np.array([[1, 2], [3, 4]])
inv_arr = np.linalg.inv(arr)
print(inv_arr)
输出:
[[-2. 1. ]
[ 1.5 -0.5]]
“`
六、NumPy的随机数生成
NumPy的np.random
模块提供了各种随机数生成函数。
np.random.rand(shape)
:生成服从均匀分布的随机数。np.random.randn(shape)
:生成服从标准正态分布的随机数。np.random.randint(low, high, size)
:生成指定范围内的随机整数。np.random.choice(a, size, replace, p)
:从给定数组中随机选择元素。
“`python
生成一个3×3的服从均匀分布的随机数数组
rand_arr = np.random.rand(3, 3)
print(rand_arr)
生成一个2×2的服从标准正态分布的随机数数组
randn_arr = np.random.randn(2, 2)
print(randn_arr)
生成一个0到10之间的随机整数
rand_int = np.random.randint(0, 10)
print(rand_int)
从数组中随机选择5个元素 (可重复)
arr = np.array([1, 2, 3, 4, 5])
choice_arr = np.random.choice(arr, 5)
print(choice_arr)
“`
七、NumPy的应用实例
NumPy广泛应用于数据分析、机器学习、图像处理等领域。以下是一些简单的应用实例:
- 数据清洗: 使用布尔索引过滤掉异常值。
- 数据归一化: 将数据缩放到指定范围内。
- 图像处理: 使用数组表示图像,并进行各种图像操作。
- 机器学习: 使用NumPy进行矩阵运算和数据预处理。
八、总结
NumPy是Python中用于科学计算的基础包,提供了强大的N维数组对象和丰富的数学函数。掌握NumPy对于进行数据分析和机器学习至关重要。本文介绍了NumPy的核心概念、数组的创建和操作、算术运算、广播机制、线性代数和随机数生成等功能。通过学习本文,你将能够快速入门NumPy,并将其应用到你的数据分析项目中。 继续深入学习NumPy的高级特性,例如掩码数组、结构化数组、以及与其他科学计算库(如SciPy和Pandas)的集成,将进一步提升你的数据分析能力。 实践是最好的老师。 多练习,多尝试,你将逐渐掌握NumPy,并成为一个熟练的数据分析师。