NumPy基础入门

NumPy基础入门

前言

NumPy(Numerical Python)是Python科学计算的基础库,为数据分析、机器学习等领域提供了强大的数组操作能力。本文将带您从零开始,通过实际代码示例深入理解NumPy的核心概念和常用操作。

一、NumPy基础概念

1.1 什么是NumPy

NumPy是Python中用于科学计算的基础包,它提供了高性能的多维数组对象和用于处理这些数组的工具。NumPy的核心是ndarray(n-dimensional array)对象,这是一个多维数组,具有以下特点:

  • 同质数据类型
  • 固定大小
  • 支持向量化操作
  • 内存效率高

1.2 安装和导入

python 复制代码
# 安装NumPy
# pip install numpy

# 导入NumPy
import numpy as np

二、NumPy数组的创建

2.1 从Python列表创建数组

python 复制代码
# 创建整数数组
arr1 = np.array([1, 2, 3, 4, 5])
print(f"数组:{arr1}")
print(f"数组类型:{type(arr1)}")
print(f"数组的元素类型:{arr1.dtype}")

# 创建浮点数数组
arr2 = np.array([1.0, 2.0, 3.0, 4.0, 5.0])
print(f"数组:{arr2}")
print(f"数组类型:{type(arr2)}")
print(f"数组的元素类型:{arr2.dtype}")

输出结果:

复制代码
数组:[1 2 3 4 5]
数组类型:<class 'numpy.ndarray'>
数组的元素类型:int32

数组:[1. 2. 3. 4. 5.]
数组类型:<class 'numpy.ndarray'>
数组的元素类型:float64

2.2 使用特殊函数创建数组

zeros() - 创建全零数组
python 复制代码
# 创建2行3列的全零数组
arr3 = np.zeros((2, 3))
print(f"数组:{arr3}")
print(f"数组类型:{type(arr3)}")
print(f"数组的元素类型:{arr3.dtype}")

输出结果:

复制代码
数组:[[0. 0. 0.]
 [0. 0. 0.]]
数组类型:<class 'numpy.ndarray'>
数组的元素类型:float64
ones() - 创建全一数组
python 复制代码
# 创建三维全一数组
arr4 = np.ones((2, 3, 4))
print(f"数组:{arr4}")
print(f"数组类型:{type(arr4)}")
print(f"数组的元素类型:{arr4.dtype}")

输出结果:

复制代码
数组:[[[1. 1. 1. 1.]
  [1. 1. 1. 1.]
  [1. 1. 1. 1.]]

 [[1. 1. 1. 1.]
  [1. 1. 1. 1.]
  [1. 1. 1. 1.]]]
数组类型:<class 'numpy.ndarray'>
数组的元素类型:float64
arange() - 创建等差数列
python 复制代码
# 创建指定步长的数组
arr6 = np.arange(1, 5, 2, dtype=np.float32)
print(f"数组:{arr6}")
print(f"数组类型:{type(arr6)}")
print(f"数组的元素类型:{arr6.dtype}")

输出结果:

复制代码
数组:[1. 3.]
数组类型:<class 'numpy.ndarray'>
数组的元素类型:float32

2.3 随机数组生成

python 复制代码
# rand() - 生成0~1之间的随机数
arr8 = np.random.rand(2, 3)
print(f"rand数组:{arr8}")

# randint() - 生成随机整数
arr9 = np.random.randint(1, 10, (2, 3))
print(f"randint数组:{arr9}")

# uniform() - 生成指定范围的均匀分布随机数
arr10 = np.random.uniform(0, 2, (2, 3))
print(f"uniform数组:{arr10}")

三、NumPy数组属性详解

3.1 基本属性

python 复制代码
# 创建一个3行5列的二维数组
arr = np.arange(15).reshape(3, 5)
print(f"ndarray对象:{arr}")

# 查看数组的各种属性
print(f"数组的形状(维度):{arr.shape}")      # (3, 5)
print(f"数组的轴:{arr.ndim}")               # 2
print(f"数组的长度:{arr.size}")             # 15
print(f"数组的每个元素数据类型:{arr.dtype}")   # int32
print(f"数组的每个元素的大小(字节):{arr.itemsize}") # 4
print(f"数组的类型:{type(arr)}")

输出结果:

复制代码
ndarray对象:[[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13 14]]
数组的形状(维度):(3, 5)
数组的轴:2
数组的长度:15
数组的每个元素数据类型:int32
数组的每个元素的大小(字节):4
数组的类型:<class 'numpy.ndarray'>

3.2 属性说明

  • shape: 数组的形状,返回一个元组
  • ndim: 数组的维度数
  • size: 数组中元素的总数
  • dtype: 数组元素的数据类型
  • itemsize: 每个元素占用的字节数

四、特殊数列的创建

4.1 等差数列 - linspace()

python 复制代码
# 创建包含终点的等差数列
a1 = np.linspace(1, 10, 10, endpoint=True)
print(f"包含终点的等差数列:{a1}")

# 创建不包含终点的等差数列
a2 = np.linspace(1, 10, 10, endpoint=False)
print(f"不包含终点的等差数列:{a2}")

输出结果:

复制代码
包含终点的等差数列:[ 1.  2.  3.  4.  5.  6.  7.  8.  9. 10.]
不包含终点的等差数列:[1.  1.9 2.8 3.7 4.6 5.5 6.4 7.3 8.2 9.1]

4.2 等比数列 - logspace()

python 复制代码
# 创建以10为底的等比数列
a3 = np.logspace(0, 9, 10)
print(f"以10为底的等比数列:{a3}")

# 创建以2为底的等比数列
a4 = np.logspace(0, 9, 10, base=2)
print(f"以2为底的等比数列:{a4}")

输出结果:

复制代码
以10为底的等比数列:[1.e+00 1.e+01 1.e+02 1.e+03 1.e+04 1.e+05 1.e+06 1.e+07 1.e+08 1.e+09]
以2为底的等比数列:[  1.   2.   4.   8.  16.  32.  64. 128. 256. 512.]

五、NumPy内置函数详解

5.1 基本数学函数

python 复制代码
import numpy as np

# 创建测试数组
arr = np.random.randn(2, 3)
print(f"原始数组:{arr}")

# 基本数学函数
print(f"向上取整:{np.ceil(arr)}")
print(f"向下取整:{np.floor(arr)}")
print(f"四舍五入:{np.rint(arr)}")
print(f"绝对值:{np.abs(arr)}")
print(f"元素相乘:{np.multiply(arr, 2)}")
print(f"元素相除:{np.divide(arr, 2)}")

5.2 统计函数

python 复制代码
# 创建测试数组
arr = np.arange(12).reshape(3, 4)
print(f"数组:{arr}")

# 统计函数
print(f"累加和:{np.cumsum(arr)}")
print(f"所有元素的和:{np.sum(arr)}")
print(f"按列求和:{np.sum(arr, axis=0)}")
print(f"按行求和:{np.sum(arr, axis=1)}")
print(f"平均值:{np.mean(arr)}")
print(f"最大值:{np.max(arr)}")
print(f"最小值:{np.min(arr)}")
print(f"标准差:{np.std(arr)}")
print(f"方差:{np.var(arr)}")

输出结果:

复制代码
数组:[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
累加和:[ 0  1  3  6 10 15 21 28 36 45 55 66]
所有元素的和:66
按列求和:[12 15 18 21]
按行求和:[ 6 22 38]

5.3 逻辑函数

python 复制代码
# 创建测试数组
arr = np.random.randn(2, 3)
print(f"数组:{arr}")

# 逻辑函数
print(f"是否有元素大于0:{np.any(arr > 0)}")
print(f"是否所有元素都大于0:{np.all(arr > 0)}")

5.4 去重和排序

python 复制代码
# 去重函数
arr = np.array([[1, 2, 1, 6], [1, 3, 2, 5]])
print(f"原始数组:{arr}")
print(f"去重结果:{np.unique(arr)}")

# 排序函数
arr = np.array([1, 5, 3, 2, 6])
print(f"原始数组:{arr}")

# 方式1:返回新数组
arr_new = np.sort(arr)
print(f"排序后的新数组:{arr_new}")

# 方式2:修改原数组
arr.sort()
print(f"排序后的原数组:{arr}")

六、NumPy数组运算

6.1 基本运算

python 复制代码
# 创建两个数组
arr1 = np.array([10, 20, 30, 40])
arr2 = np.arange(4)

# 基本运算
print(f"arr1:{arr1}")
print(f"arr2:{arr2}")
print(f"加法:{arr1 + arr2}")
print(f"乘法:{arr1 * arr2}")
print(f"使用multiply函数:{np.multiply(arr1, arr2)}")

输出结果:

复制代码
arr1:[10 20 30 40]
arr2:[0 1 2 3]
加法:[10 21 32 43]
乘法:[  0  20  60 120]
使用multiply函数:[  0  20  60 120]

6.2 矩阵运算

情况1:行列数相同
python 复制代码
# 创建两个相同形状的矩阵
arr1 = np.array([[1, 2, 3], [3, 4, 5]])
arr2 = np.array([[1, 2, 3], [3, 4, 5]])

# 对应元素相乘
arr3 = arr1 * arr2
print(f"arr1:{arr1}")
print(f"arr2:{arr2}")
print(f"对应元素相乘:{arr3}")

输出结果:

复制代码
arr1:[[1 2 3]
 [3 4 5]]
arr2:[[1 2 3]
 [3 4 5]]
对应元素相乘:[[ 1  4  9]
 [ 9 16 25]]
情况2:矩阵乘法
python 复制代码
# 创建两个矩阵
arr1 = np.array([[1, 2, 3], [3, 4, 5]])
arr2 = np.array([[9, 8], [6, 5], [3, 2]])

# 矩阵乘法
arr3 = arr1.dot(arr2)
print(f"arr1:{arr1}")
print(f"arr2:{arr2}")
print(f"矩阵乘法结果:{arr3}")

输出结果:

复制代码
arr1:[[1 2 3]
 [3 4 5]]
arr2:[[9 8]
 [6 5]
 [3 2]]
矩阵乘法结果:[[30 24]
 [66 54]]

七、数据类型转换

python 复制代码
# 创建浮点数数组
arr11 = np.random.rand(2, 3)
print(f"原始数组:{arr11}")
print(f"数据类型:{arr11.dtype}")

# 转换为整数类型
arr12 = arr11.astype(np.int64)
print(f"转换后数组:{arr12}")
print(f"转换后数据类型:{arr12.dtype}")

输出结果:

复制代码
原始数组:[[0.72136545 0.6794097  0.48066728]
 [0.23596109 0.72567473 0.28769567]]
数据类型:float64
转换后数组:[[0 0 0]
 [0 0 0]]
转换后数据类型:int64

八、实际应用案例

8.1 数据分析基础操作

python 复制代码
# 模拟学生成绩数据
scores = np.random.randint(60, 100, (5, 4))  # 5个学生,4门课程
print(f"学生成绩矩阵:\n{scores}")

# 统计分析
print(f"每门课程的平均分:{np.mean(scores, axis=0)}")
print(f"每个学生的平均分:{np.mean(scores, axis=1)}")
print(f"最高分:{np.max(scores)}")
print(f"最低分:{np.min(scores)}")
print(f"成绩标准差:{np.std(scores):.2f}")

8.2 图像数据处理模拟

python 复制代码
# 模拟图像数据(灰度图)
image = np.random.randint(0, 256, (10, 10))
print(f"原始图像数据:\n{image}")

# 图像处理操作
# 1. 归一化到0-1范围
normalized = image / 255.0
print(f"归一化后:\n{normalized}")

# 2. 图像增强(乘以1.5)
enhanced = np.clip(image * 1.5, 0, 255).astype(np.uint8)
print(f"增强后:\n{enhanced}")

九、总结

本文详细介绍了NumPy的基础知识,包括:

  1. 数组创建:从列表创建、使用特殊函数创建、随机数组生成
  2. 数组属性:shape、ndim、size、dtype等核心属性
  3. 特殊数列:等差数列和等比数列的创建方法
  4. 内置函数:数学函数、统计函数、逻辑函数、去重排序函数
  5. 数组运算:基本运算、矩阵运算、数据类型转换
  6. 实际应用:数据分析、图像处理等实际场景

NumPy作为Python科学计算的基础,掌握这些核心概念对于后续学习Pandas、Matplotlib、Scikit-learn等库至关重要。建议读者多动手实践,在实际项目中运用这些知识。

十、扩展学习建议

  1. 深入学习:了解NumPy的高级特性,如广播机制、索引技巧
  2. 结合应用:学习Pandas进行数据分析,结合Matplotlib进行数据可视化
  3. 性能优化:学习NumPy的向量化操作,提高代码执行效率
  4. 实际项目:参与数据分析项目,将理论知识应用到实际问题中

作者寄语:NumPy是Python科学计算生态系统的基石,掌握好NumPy将为您的数据科学之旅打下坚实基础。希望本文能帮助您快速入门NumPy,开启数据科学的学习之路!