NumPy 是 Python 中用于科学计算的核心库,它提供了高性能的多维数组对象 ndarray
以及一系列用于操作这些数组的工具。本文将详细介绍 NumPy 的基础知识、数组操作、数据类型、矩阵运算、广播机制以及统计分析等功能,并通过丰富的代码示例帮助你快速掌握 NumPy。
一、简介
NumPy 主要用于存储和处理大型矩阵,提供了一种存储单一数据类型的多维数组对象 ndarray
。此外,NumPy 还提供了多种运算函数,能够完成数据计算和统计分析,是数据分析的重要工具包。
二、数组对象 (ndarray)
1. 创建数组对象
(1)创建自定义数组
import numpy as np
# 创建一个自定义数组
a = np.array([1, 2, 3], dtype=float)
print(a) # 输出: [1. 2. 3.]
# 通过 arange 函数创建一维数组
b = np.arange(0, 10, 2)
print(b) # 输出: [0 2 4 6 8]
# 创建一维等差数组
c = np.linspace(0, 1, 5)
print(c) # 输出: [0. 0.25 0.5 0.75 1. ]
# 创建全零数组
d = np.zeros((3, 4))
print(d)
# 输出:
# [[0. 0. 0. 0.]
# [0. 0. 0. 0.]
# [0. 0. 0. 0.]]
# 创建全为 1 的数组
e = np.ones((2, 3), dtype=int)
print(e)
# 输出:
# [[1 1 1]
# [1 1 1]]
# 创建对角线全为 1 的多维数组
f = np.eye(3)
print(f)
# 输出:
# [[1. 0. 0.]
# [0. 1. 0.]
# [0. 0. 1.]]
(2)创建随机数组
# 创建 0-1 之间的随机浮点数一维数组
g = np.random.random(5)
print(g) # 输出: [0.12345678 0.23456789 0.34567891 0.45678912 0.56789123]
# 创建指定范围的随机整数多维数组
h = np.random.randint(1, 10, size=(2, 3))
print(h)
# 输出:
# [[5 6 7]
# [8 9 1]]
# 创建服从均匀分布的随机数组
i = np.random.rand(2, 3)
print(i)
# 输出:
# [[0.123456 0.789101 0.456789]
# [0.765432 0.234567 0.987654]]
# 创建服从正态分布的随机数组
j = np.random.randn(2, 3)
print(j)
# 输出:
# [[ 0.123 -0.456 0.789]
# [-1.234 0.567 -0.890]]
2. 数组对象属性
# 创建一个示例数组
a = np.array([[1, 2, 3], [4, 5, 6]])
# 数组维数
print(a.ndim) # 输出: 2
# 数组形状
print(a.shape) # 输出: (2, 3)
# 数组元素总个数
print(a.size) # 输出: 6
# 数组元素的数据类型
print(a.dtype) # 输出: int64
# 每个元素的大小(以字节为单位)
print(a.itemsize) # 输出: 8
3. 改变数组形状
# 使用 shape 改变形状
a = np.arange(12).reshape(3, 4)
print(a)
# 输出:
# [[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]]
# 使用 reshape 改变形状
b = a.reshape(2, 6)
print(b)
# 输出:
# [[ 0 1 2 3 4 5]
# [ 6 7 8 9 10 11]]
# 展平数组
c = a.ravel()
print(c) # 输出: [ 0 1 2 3 4 5 6 7 8 9 10 11]
# 组合数组
d = np.hstack((a, b))
print(d)
# 输出:
# [[ 0 1 2 3 0 1 2 3 4 5]
# [ 4 5 6 7 6 7 8 9 10 11]
# [ 8 9 10 11 6 7 8 9 10 11]]
# 分割数组
e, f = np.hsplit(d, 2)
print(e)
# 输出:
# [[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]]
4. 访问数组
# 一维数组的访问
a = np.array([1, 2, 3, 4, 5])
print(a[2]) # 输出: 3
# 二维数组的访问
b = np.array([[1, 2, 3], [4, 5, 6]])
print(b[1, 2]) # 输出: 6
三、数据类型
NumPy 的数据类型比 Python 内置的数据类型丰富,常用的数据类型包括:
int8
,int16
,int32
,int64
uint8
,uint16
,uint32
,uint64
float16
,float32
,float64
complex64
,complex128
bool
str
,unicode
四、numpy 的矩阵对象
1. 创建矩阵
# 创建一个 2x2 矩阵
a = np.matrix('1 2; 3 4')
print(a)
# 输出:
# [[1 2]
# [3 4]]
2. 矩阵属性
# 转置
print(a.T)
# 输出:
# [[1 3]
# [2 4]]
# 共轭转置
print(a.H)
# 输出:
# [[1 3]
# [2 4]]
# 逆矩阵
print(a.I)
# 输出:
# [[-2. 1. ]
# [ 1.5 -0.5]]
# 返回自身数据的二维数组的一个视图
print(a.A)
# 输出:
# [[1 2]
# [3 4]]
3. 矩阵运算
# 四则运算
b = np.matrix('5 6; 7 8')
print(a + b)
# 输出:
# [[ 6 8]
# [10 12]]
print(a * b)
# 输出:
# [[19 22]
# [43 50]]
# 比较运算
print(a > 2)
# 输出:
# [[False False]
# [ True True]]
# 逻辑运算
print(np.any(a > 2)) # 输出: True
print(np.all(a > 2)) # 输出: False
五、ufunc 函数 (Universal Function)
1. 概念
ufunc 是一种能够对数组中所有元素进行操作的函数,结果是以数组形式输出,因此不需要对数组每个元素都进行操作,所以比 math 库中的函数操作效率高。
2. 广播机制
广播是指不同形状的数组之间进行算术运算的一种方式。广播机制遵循以下四条原则:
- 参与运算的数组其中一个的维度为 1 且列相等。
- 参与运算的