Numpy零基础vip精讲课程(下篇)_numpy进阶educoder

liftword4个月前 (02-28)技术文章20

1. 性能提升技巧

1.1 向量化操作 vs Python 循环
Numpy 的向量化操作比 Python 循环快数十甚至数百倍。

import numpy as np  
import time  

# 生成一个大型数组  
arr = np.random.rand(1000000)  

# Python 循环计算平方  
start = time.time()  
result_loop = [x**2 for x in arr]  
print("循环耗时:", time.time() - start)  # 约 0.1 秒  

# Numpy 向量化计算平方  
start = time.time()  
result_vec = arr**2  
print("向量化耗时:", time.time() - start)  # 约 0.001 秒  

1.2 内存优化(视图与副本)

  • 视图(View):共享数据内存,修改视图会影响原数组。
  • 副本(Copy):独立内存,与原数组无关。
a = np.array([1, 2, 3])  
b = a[:2]        # 视图(共享内存)  
c = a.copy()     # 副本(独立内存)  

b[0] = 99        # 修改视图会影响原数组  
print(a)         # 输出:[99 2 3]  

1.3 使用 Numba 加速
Numba 能将 Python 函数编译为机器码(需额外安装):

pip install numba  
from numba import jit  

@jit  
def sum_array(arr):  
    total = 0.0  
    for x in arr:  
        total += x  
    return total  

# 首次运行会编译,之后速度接近 C 语言  
print(sum_array(np.random.rand(1000000)))  

2. 高级数据结构

2.1 结构化数组
处理混合数据类型(类似表格):

# 定义数据类型(姓名:字符串,年龄:整数,分数:浮点数)  
dtype = [('name', 'U10'), ('age', 'i4'), ('score', 'f4')]  
students = np.array([  
    ('Alice', 20, 89.5),  
    ('Bob', 22, 92.3),  
    ('Charlie', 21, 78.0)  
], dtype=dtype)  

# 按字段查询  
print(students['name'])  # 输出:['Alice' 'Bob' 'Charlie']  
print(students[students['age'] > 20])  # 筛选年龄>20的学生  

2.2 掩码数组(处理无效值)
使用 np.ma 模块处理缺失值或无效数据:

data = np.array([1, 2, -999, 4, -999])  # -999 表示无效值  
masked_data = np.ma.masked_where(data == -999, data)  

# 计算均值(自动忽略无效值)  
print(masked_data.mean())  # 输出:(1+2+4)/3 = 2.333  

3. 与其它库结合

3.1 Matplotlib 数据可视化
将 Numpy 数组绘制为图表:

import matplotlib.pyplot as plt  

x = np.linspace(0, 2*np.pi, 100)  
y = np.sin(x)  

plt.plot(x, y)  
plt.title("Sin Wave")  
plt.show()  

3.2 Pandas 互操作
与 Pandas 无缝转换:

import pandas as pd  

# Numpy 数组 → Pandas DataFrame  
arr = np.random.rand(3, 2)  
df = pd.DataFrame(arr, columns=['A', 'B'])  

# DataFrame → Numpy 数组  
arr_back = df.to_numpy()  

4. 综合项目实战

项目 1:股票数据时间序列分析

# 生成模拟股票价格(100天)  
prices = np.cumsum(np.random.randn(100) * 0.1 + 0.05) + 100  

# 计算5日移动平均  
window_size = 5  
moving_avg = np.convolve(prices, np.ones(window_size)/window_size, mode='valid')  

# 绘制结果  
plt.plot(prices, label='Price')  
plt.plot(moving_avg, label='5-Day MA')  
plt.legend()  
plt.show()  

项目 2:简单机器学习预处理

# 生成样本数据(特征矩阵)  
X = np.random.rand(100, 3)  # 100样本,3个特征  

# 标准化(均值为0,标准差为1)  
X_mean = X.mean(axis=0)  
X_std = X.std(axis=0)  
X_normalized = (X - X_mean) / X_std  

# 添加偏置项(用于线性回归)  
X_bias = np.c_[np.ones(X.shape[0]), X_normalized]  # 形状 (100, 4)  

下篇总结

  • 掌握内容:性能优化、高级数据结构、跨库协作。
  • 重点提示:向量化是性能优化的核心,避免 Python 循环。结构化数组适合处理表格型混合数据。
  • 练习任务:用向量化操作实现两个大型数组的欧氏距离计算(公式:√(Σ(Ai-Bi)2))。将 CSV 文件中的学生成绩表转为结构化数组,并计算每个学生的平均分。

相关文章

Golang 3、数组_golang new 数组

在 Go 语言中,数组是一种固定长度的、存储相同类型元素的数据结构。1.数组的基本概念固定长度:数组的长度在定义时就确定,不能动态改变。相同类型:数组中的所有元素必须是同一类型。索引访问:通过索引(从...

Python 数组反方法完整指南_python数组取反

曾经需要在 Python 中翻转列表吗?无论您是以相反的顺序对数据进行排序、实施算法还是处理用户输入,知道如何反转数组都是一项基本技能。用于反转列表的内置方法reverse() 方法:就地列表反转'r...

Bash Shell脚本中的数组使用实例_linux shell脚本 数组

数组是一个包含多个值的变量,这些值可以是相同类型或不同类型。没有数组大小限制,也没有要求成员变量被连续索引或连续分配的限制。数组索引从0开始。1.声明一个数组并赋值在bash中,使用以下格式的变量时会...

Python 数据类型 - 数组_python数组的应用

Python 数据类型 - 数组在本节中,你将学习如何在 Python 中创建和访问数组的元素。数组是相同数据类型的元素的集合。数组和列表之间的主要区别是列表可以具有不同数据类型的元素。在 Pytho...

python实现数组操作代码_python数组操作方法

Python是一种功能强大的编程语言,尤其在处理数组和列表等数据结构时非常出色。它提供了许多有用的工具和库,使得数组操作变得轻松和高效。本文将详细介绍Python中实现数组操作的代码,并给出一些示例。...

Python 数组限制数_python数组写法

def limit_array(nums, limit): # 遍历数组,将每个元素限制在limit以内 for i in range(len(nums)): if n...