第142集:NumPy数组基础

一、什么是NumPy?

NumPy(Numerical Python)是Python中用于科学计算的核心库,提供了高效的多维数组对象和丰富的数学函数,是数据分析、机器学习、深度学习等领域的基础工具。

NumPy的主要特点

  1. 高效的多维数组:提供ndarray对象,用于存储和操作同类型的多维数据
  2. 矢量运算:支持广播(Broadcasting)机制,实现无需循环的高效元素级操作
  3. 丰富的数学函数:包含大量用于数组运算的数学函数(如线性代数、随机数生成等)
  4. 内存效率高:比Python列表更节省内存,访问速度更快
  5. 与其他库的良好集成:是Pandas、Matplotlib等数据分析和可视化库的基础

二、NumPy数组的创建

1. 从Python列表创建数组

使用np.array()函数可以将Python列表转换为NumPy数组:

import numpy as np

# 创建一维数组
arr1 = np.array([1, 2, 3, 4, 5])
print(arr1)  # 输出:[1 2 3 4 5]

# 创建二维数组
arr2 = np.array([[1, 2, 3], [4, 5, 6]])
print(arr2)
# 输出:
# [[1 2 3]
#  [4 5 6]]

# 创建三维数组
arr3 = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])
print(arr3)

2. 创建特殊数组

NumPy提供了多种创建特殊数组的函数:

# 创建全0数组
zeros = np.zeros((2, 3))  # 2行3列的全0数组
print(zeros)

# 创建全1数组
ones = np.ones((3, 2))  # 3行2列的全1数组
print(ones)

# 创建指定值数组
full = np.full((2, 2), 5)  # 2行2列的全5数组
print(full)

# 创建单位矩阵(对角线为1,其余为0的方阵)
identity = np.eye(3)  # 3x3的单位矩阵
print(identity)

# 创建对角矩阵
diagonal = np.diag([1, 2, 3])  # 对角线元素为1,2,3的矩阵
print(diagonal)

3. 创建等差数列

# 创建等差数列(start, stop, num)
# 从0到10,生成5个元素
arr = np.linspace(0, 10, 5)
print(arr)  # 输出:[ 0.   2.5  5.   7.5 10. ]

# 创建等差数列(start, stop, step)
# 从0到10,步长为2
arr = np.arange(0, 10, 2)
print(arr)  # 输出:[0 2 4 6 8]

4. 创建随机数组

# 创建0到1之间的随机浮点数数组
random_float = np.random.rand(2, 3)  # 2行3列
print(random_float)

# 创建指定范围内的随机整数数组
random_int = np.random.randint(1, 10, size=(2, 3))  # 1-10之间的随机整数,2行3列
print(random_int)

# 创建符合正态分布的随机数数组
# 均值为0,标准差为1
random_normal = np.random.randn(2, 3)
print(random_normal)

三、NumPy数组的属性

NumPy数组有一些重要的属性,可以帮助我们了解数组的结构:

import numpy as np

arr = np.array([[1, 2, 3], [4, 5, 6]])

# 数组的维度
print(arr.ndim)  # 输出:2

# 数组的形状(行数, 列数)
print(arr.shape)  # 输出:(2, 3)

# 数组的元素总数
print(arr.size)  # 输出:6

# 数组元素的数据类型
print(arr.dtype)  # 输出:int64

# 每个元素所占的字节数
print(arr.itemsize)  # 输出:8

# 数组所占的总字节数
print(arr.nbytes)  # 输出:48 (6个元素 × 8字节/元素)

四、NumPy数组的基本操作

1. 索引和切片

NumPy数组的索引和切片与Python列表类似,但支持多维索引:

import numpy as np

# 一维数组
arr1 = np.array([1, 2, 3, 4, 5])
print(arr1[0])  # 输出:1
print(arr1[1:4])  # 输出:[2 3 4]
print(arr1[::2])  # 输出:[1 3 5]

# 二维数组
arr2 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(arr2[0, 0])  # 输出:1(第0行第0列)
print(arr2[1, :])  # 输出:[4 5 6](第1行所有元素)
print(arr2[:, 1])  # 输出:[2 5 8](第1列所有元素)
print(arr2[0:2, 1:3])  # 输出:[[2 3], [5 6]](第0-1行,第1-2列)

2. 数组的重塑

使用reshape()方法可以改变数组的形状,但元素总数必须保持不变:

import numpy as np

arr = np.array([1, 2, 3, 4, 5, 6])

# 重塑为2行3列
reshaped = arr.reshape(2, 3)
print(reshaped)
# 输出:
# [[1 2 3]
#  [4 5 6]]

# 重塑为3行2列
reshaped = arr.reshape(3, 2)
print(reshaped)
# 输出:
# [[1 2]
#  [3 4]
#  [5 6]]

# 使用-1自动计算维度
reshaped = arr.reshape(3, -1)  # 3行,列数自动计算
print(reshaped)

3. 数组的转置

使用transpose()方法或.T属性可以对数组进行转置:

import numpy as np

arr = np.array([[1, 2, 3], [4, 5, 6]])

# 转置
transposed = arr.transpose()
print(transposed)
# 输出:
# [[1 4]
#  [2 5]
#  [3 6]]

# 使用.T属性
print(arr.T)

4. 数组的拼接

import numpy as np

arr1 = np.array([[1, 2], [3, 4]])
arr2 = np.array([[5, 6], [7, 8]])

# 水平拼接(按列拼接)
horizontal = np.hstack((arr1, arr2))
print(horizontal)
# 输出:
# [[1 2 5 6]
#  [3 4 7 8]]

# 垂直拼接(按行拼接)
vertical = np.vstack((arr1, arr2))
print(vertical)
# 输出:
# [[1 2]
#  [3 4]
#  [5 6]
#  [7 8]]

五、NumPy数组与Python列表的比较

特性 NumPy数组 Python列表
元素类型 必须相同 可以不同
内存效率
访问速度
向量化运算 支持 不支持
数学函数 丰富 有限
多维支持 原生支持 通过嵌套实现

六、NumPy数组的优势

  1. 性能优势

    • NumPy数组在内存中是连续存储的,访问速度更快
    • 向量化运算避免了Python的循环开销
    • 底层使用C语言实现,执行效率高
  2. 语法简洁

    • arr * 2代替[x * 2 for x in list]
    • np.dot(arr1, arr2)实现矩阵乘法,无需嵌套循环
  3. 功能丰富

    • 提供了大量用于科学计算的函数
    • 支持广播机制,简化不同形状数组之间的运算

七、总结

NumPy是Python数据分析的基础库,其核心是ndarray对象。本节课我们学习了:

  1. NumPy的基本概念和特点
  2. 数组的创建方法(从列表创建、特殊数组、等差数列、随机数组)
  3. 数组的属性(维度、形状、大小、数据类型)
  4. 基本操作(索引、切片、重塑、转置、拼接)
  5. 与Python列表的比较

掌握NumPy数组的基础知识是学习后续数据分析内容的关键。在下一节课中,我们将学习更多NumPy数组的高级操作,包括广播机制、数学运算等。

八、练习

  1. 创建一个3行4列的全0数组
  2. 创建一个4行4列的单位矩阵
  3. 创建一个从0到15的一维数组,然后重塑为4行4列
  4. 创建两个2行2列的数组,分别进行水平拼接和垂直拼接
  5. 计算数组中所有元素的和、平均值、最大值和最小值

扩展阅读

« 上一篇 数据分析概念 下一篇 » NumPy数组操作