Python 中的 NumPy:数值计算基础

NumPy(Numerical Python)是一个用于科学计算的基础包。它提供了支持高效数组和矩阵操作的强大功能,同时还提供了大量的数学函数库。NumPy 是许多数据科学和机器学习库(如 Pandas、Scikit-Learn 和 TensorFlow)的基础,因此理解 NumPy 是掌握 Python 科学计算的关键。

一、NumPy 的安装与导入

在使用 NumPy 之前,需要确保已安装该库。可以使用以下命令进行安装:

sh

pip install numpy

安装完成后,可以在 Python 脚本或交互式环境中导入 NumPy:

 

import numpy as np

二、NumPy 数组

NumPy 数组(ndarray)是一个多维的同类型元素的容器。它提供了对数组元素进行高效操作的方法。

1. 数组的创建

可以通过多种方式创建 NumPy 数组,常见方法包括使用 Python 列表、NumPy 函数和读取文件等。

从列表创建数组:

 

import numpy as np # 一维数组 a = np.array([1, 2, 3]) print(a) # 输出: [1 2 3] # 二维数组 b = np.array([[1, 2, 3], [4, 5, 6]]) print(b) # 输出: # [[1 2 3] # [4 5 6]]

使用 NumPy 函数创建数组:

 

# 创建全零数组 zeros_array = np.zeros((3, 3)) print(zeros_array) # 输出: # [[0. 0. 0.] # [0. 0. 0.] # [0. 0. 0.]] # 创建全一数组 ones_array = np.ones((2, 3)) print(ones_array) # 输出: # [[1. 1. 1.] # [1. 1. 1.]] # 创建指定值的数组 full_array = np.full((2, 2), 7) print(full_array) # 输出: # [[7 7] # [7 7]] # 创建单位矩阵 eye_array = np.eye(3) print(eye_array) # 输出: # [[1. 0. 0.] # [0. 1. 0.] # [0. 0. 1.]] # 使用 arange 创建数组 arange_array = np.arange(0, 10, 2) print(arange_array) # 输出: [0 2 4 6 8] # 使用 linspace 创建数组 linspace_array = np.linspace(0, 1, 5) print(linspace_array) # 输出: [0. 0.25 0.5 0.75 1. ]

2. 数组属性

NumPy 数组有许多属性可以帮助我们了解数组的结构和内容。

 

a = np.array([[1, 2, 3], [4, 5, 6]]) print(a.shape) # 输出: (2, 3) print(a.size) # 输出: 6 print(a.ndim) # 输出: 2 print(a.dtype) # 输出: int64 print(a.itemsize) # 输出: 8 (字节数,可能因平台不同) print(a.nbytes) # 输出: 48 (数组总字节数)

3. 数组的索引与切片

NumPy 数组支持丰富的索引和切片操作,可以方便地访问和修改数组的元素。

 

a = np.array([1, 2, 3, 4, 5]) # 索引 print(a[0]) # 输出: 1 print(a[4]) # 输出: 5 # 切片 print(a[1:3]) # 输出: [2 3] print(a[:2]) # 输出: [1 2] print(a[::2]) # 输出: [1 3 5] # 二维数组的索引与切片 b = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) print(b[1, 2]) # 输出: 6 print(b[0:2, 1:3]) # 输出: # [[2 3] # [5 6]] # 使用布尔数组进行索引 bool_index = (a > 2) print(a[bool_index]) # 输出: [3 4 5]

4. 数组的运算

NumPy 提供了丰富的数学运算方法,可以对数组进行元素级别的运算。

 

a = np.array([1, 2, 3]) b = np.array([4, 5, 6]) # 基本运算 print(a + b) # 输出: [5 7 9] print(a - b) # 输出: [-3 -3 -3] print(a * b) # 输出: [ 4 10 18] print(a / b) # 输出: [0.25 0.4 0.5 ] # 数学函数 print(np.sqrt(a)) # 输出: [1. 1.41421356 1.73205081] print(np.exp(a)) # 输出: [ 2.71828183 7.3890561 20.08553692] print(np.log(a)) # 输出: [0. 0.69314718 1.09861229] # 统计函数 print(np.mean(a)) # 输出: 2.0 print(np.std(a)) # 输出: 0.816496580927726 print(np.sum(a)) # 输出: 6 print(np.prod(a)) # 输出: 6

5. 数组的形状操作

NumPy 提供了多种方法来改变数组的形状,而不改变其数据。

 

a = np.array([[1, 2, 3], [4, 5, 6]]) # 改变形状 reshaped_a = a.reshape((3, 2)) print(reshaped_a) # 输出: # [[1 2] # [3 4] # [5 6]] # 数组展平 flattened_a = a.flatten() print(flattened_a) # 输出: [1 2 3 4 5 6] # 转置 transposed_a = a.T print(transposed_a) # 输出: # [[1 4] # [2 5] # [3 6]]

6. 数组的合并与分割

NumPy 支持多种方式的数组合并与分割。

 

a = np.array([[1, 2], [3, 4]]) b = np.array([[5, 6], [7, 8]]) # 数组合并 concatenated_ab = np.concatenate((a, b), axis=0) print(concatenated_ab) # 输出: # [[1 2] # [3 4] # [5 6] # [7 8]] stacked_ab = np.stack((a, b), axis=1) print(stacked_ab) # 输出: # [[[1 2] # [5 6]] # # [[3 4] # [7 8]]] # 数组分割 split_a = np.split(a, 2, axis=0) print(split_a) # 输出: [array([[1, 2]]), array([[3, 4]])]

7. 广播机制

NumPy 的广播机制允许不同形状的数组进行算术运算。

 

a = np.array([1, 2, 3]) b = np.array([[4], [5], [6]]) # 广播加法 print(a + b) # 输出: # [[5 6 7] # [6 7 8] # [7 8 9]]

三、NumPy 在数据科学中的应用

NumPy 是数据科学的基石,在数据处理、分析和机器学习中扮演着重要角色。

1. 数据处理

读取和写入文件

 

# 保存数组到文件 a = np.array([1, 2, 3, 4, 5]) np.save('array.npy', a) # 从文件读取数组 loaded_a = np.load('array.npy') print(loaded_a) # 输出: [1 2 3 4 5]

读取文本文件

 

# 保存到文本文件 np.savetxt('array.txt', a) # 从文本文件读取 loaded_txt_a = np.loadtxt('array.txt') print(loaded_txt_a) # 输出: [1. 2. 3. 4. 5.]

2. 数据分析

统计分析

 

data = np.array([1, 2, 2, 3, 3, 3, 4, 4, 4, 4]) # 统计数据 mean = np.mean(data) std = np.std(data) variance = np.var(data) median = np.median(data) unique_elements, counts_elements = np.unique(data, return_counts=True) print("Mean:", mean) print("Standard Deviation:", std) print("Variance:", variance) print("Median:", median) print("Unique Elements:", unique_elements) print("Counts:", counts_elements)

相关分析

 

x = np.array([1, 2, 3, 4, 5]) y = np.array([2, 4, 6, 8, 10]) # 计算相关系数 correlation_matrix = np.corrcoef(x, y) print(correlation_matrix) # 输出: # [[1. 1.] # [1. 1.]]

3. 线性代数

NumPy 提供了丰富的线性代数操作函数,可以高效地处理矩阵运算。

 

a = np.array([[1, 2], [3, 4]]) b = np.array([[5, 6], [7, 8]]) # 矩阵乘法 matmul_ab = np.matmul(a, b) print(matmul_ab) # 输出: # [[19 22] # [43 50]] # 计算行列式 det_a = np.linalg.det(a) print(det_a) # 输出: -2.0000000000000004 # 计算逆矩阵 inv_a = np.linalg.inv(a) print(inv_a) # 输出: # [[-2. 1. ] # [ 1.5 -0.5]] # 计算特征值和特征向量 eigenvalues, eigenvectors = np.linalg.eig(a) print("Eigenvalues:", eigenvalues) print("Eigenvectors:", eigenvectors)

四、NumPy 与其他库的集成

NumPy 是许多高级数据处理和分析库的基础。了解如何与其他库集成,可以充分发挥 NumPy 的优势。

1. Pandas

Pandas 是基于 NumPy 构建的数据分析库,提供了强大的数据结构和数据分析工具。

 

import pandas as pd # 从 NumPy 数组创建 DataFrame a = np.array([[1, 2, 3], [4, 5, 6]]) df = pd.DataFrame(a, columns=['A', 'B', 'C']) print(df)

2. Matplotlib

Matplotlib 是一个 2D 绘图库,结合 NumPy 可以进行数据可视化。

 

import matplotlib.pyplot as plt # 绘制 NumPy 数组数据 x = np.linspace(0, 10, 100) y = np.sin(x) plt.plot(x, y) plt.xlabel('x') plt.ylabel('sin(x)') plt.title('Sine Wave') plt.show()

3. SciPy

SciPy 是一个科学计算库,基于 NumPy 提供更多的科学计算函数。

 

from scipy import optimize # 使用 SciPy 求解方程 def func(x): return x**2 - 4 root = optimize.root(func, 0) print(root.x) # 输出: [2.]

五、NumPy 最佳实践
  • 熟悉数组广播:理解并使用 NumPy 的广播机制,可以避免显式的循环,提高代码效率。
  • 使用矢量化操作:尽量使用 NumPy 提供的矢量化操作函数,避免使用 Python 的 for 循环。
  • 合理使用数据类型:选择合适的数据类型(如 float32 代替 float64),可以减少内存占用,提高计算速度。
  • 善用 NumPy 函数:NumPy 提供了丰富的函数库,充分利用这些函数可以简化代码,提高可读性和性能。

结论

NumPy 是 Python 科学计算的基础库,其强大的数组和矩阵处理能力以及丰富的数学函数库,使得它在数据科学、机器学习和工程计算中得到广泛应用。通过本文的介绍,读者应该能够掌握 NumPy 的基本使用方法和最佳实践,从而更高效地进行数值计算和数据处理。

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值