做数据分析时,你是否遇到过这些问题:处理几十万行销售数据时程序慢如蜗牛?计算月度销售额要写冗长的循环代码?进行多维度统计时逻辑混乱容易出错?今天,我们带你掌握数据分析的“加速器”——NumPy,让你用1行代码完成过去100行的计算任务,效率提升百倍!
np.array()将列表转换为数组,使用np.arange()、np.linspace()、np.zeros()、np.ones()等函数快速创建数组。reshape()、transpose()、concatenate()等形状操作函数。+、-、*、/等运算符进行逐元素运算,调用np.dot()进行矩阵乘法,使用np.mean()、np.sum()、np.std()等统计函数。# 导入必要库import numpy as npimport pandas as pdimport matplotlib.pyplot as plt# 设置中文显示plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']plt.rcParams['axes.unicode_minus'] = False# 设置随机种子确保结果可复现np.random.seed(2026)print("✅ 环境准备完成!")print(f"NumPy版本:{np.__version__}")# 模拟2026年1月销售数据:30天,3种产品,5个销售区域# 数据维度:(天数, 产品数, 区域数) = (30, 3, 5)days = 30products = 3regions = 5# 生成销售数据:每天每个产品在每个区域的销售额(单位:万元)# 使用正态分布:均值50,标准差20,确保非负sales_data = np.random.normal(loc=50, scale=20, size=(days, products, regions))sales_data = np.abs(sales_data) # 确保非负print("📊 销售数据基本信息:")print(f"数据形状:{sales_data.shape}") # (30, 3, 5)print(f"数据类型:{sales_data.dtype}") # float64print(f"总数据量:{sales_data.size:,} 个值") # 30×3×5=450print(f"销售额范围:{sales_data.min():.2f} ~ {sales_data.max():.2f} 万元")print(f"平均销售额:{sales_data.mean():.2f} 万元")import time# 使用Python列表计算1百万个数的平方list_data = list(range(1_000_000))start_time = time.time()list_squares = [x ** 2for x in list_data]list_time = time.time() - start_time# 使用NumPy数组计算1百万个数的平方array_data = np.array(list_data)start_time = time.time()array_squares = array_data ** 2array_time = time.time() - start_timeprint("⚡ 性能对比:计算1百万个数的平方")print(f"Python列表耗时:{list_time:.4f} 秒")print(f"NumPy数组耗时:{array_time:.4f} 秒")print(f"NumPy加速比:{list_time/array_time:.1f} 倍")
# 1. 各种数组创建方法print("🎯 数组创建示例:")# 从列表创建arr_from_list = np.array([1, 2, 3, 4, 5])print(f"从列表创建:{arr_from_list}")# 等差数列数组arr_arange = np.arange(0, 10, 2) # 0到10,步长2print(f"arange创建:{arr_arange}")# 等间距数组arr_linspace = np.linspace(0, 1, 5) # 0到1,5个等间距点print(f"linspace创建:{arr_linspace}")# 全零数组arr_zeros = np.zeros((3, 4))print(f"全零数组(3×4):\\n{arr_zeros}")# 全一数组arr_ones = np.ones((2, 3))print(f"全一数组(2×3):\\n{arr_ones}")# 单位矩阵arr_identity = np.eye(3)print(f"单位矩阵(3×3):\\n{arr_identity}")# 2. 销售数据分析:基于模拟数据print("\\n💰 销售数据分析实战:")# 查看第一天的销售数据day1_sales = sales_data[0] # 第一维度:天数print(f"第1天销售数据(产品×区域):\\n{day1_sales}")print(f"形状:{day1_sales.shape}") # (3, 5)# 计算每日总销售额(沿产品和区域维度求和)daily_total = sales_data.sum(axis=(1, 2)) # 对第1、2维求和print(f"\\n每日总销售额(30天):\\n{daily_total}")print(f"月销售总额:{daily_total.sum():.2f} 万元")# 计算每个产品的月度销售额product_monthly = sales_data.sum(axis=(0, 2)) # 对天数、区域求和print(f"\\n各产品月度销售额:")for i, sales inenumerate(product_monthly):print(f" 产品{i+1}:{sales:.2f} 万元")# 计算每个区域的月度销售额region_monthly = sales_data.sum(axis=(0, 1)) # 对天数、产品求和print(f"\\n各区域月度销售额:")for i, sales inenumerate(region_monthly):print(f" 区域{i+1}:{sales:.2f} 万元")# 3. 高级索引技巧print("\\n🎯 数组索引与切片:")# 创建示例数组arr = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])print(f"原始数组(3×4):\\n{arr}")# 基本切片print(f"\\n1. 基本切片:")print(f" 第1行:{arr[0]}") # [1 2 3 4]print(f" 第2列:{arr[:, 1]}") # [2 6 10]print(f" 前2行,后2列:\\n{arr[:2, -2:]}") # [[3 4], [7 8]]# 布尔索引:筛选销售额大于60的数据high_sales_mask = sales_data > 60high_sales_count = high_sales_mask.sum()print(f"\\n2. 布尔索引:销售额>60的记录数:{high_sales_count:,}")# 花式索引:提取特定产品在特定区域的数据product_indices = [0, 2] # 产品1和产品3region_indices = [1, 3, 4] # 区域2、4、5selected_data = sales_data[:, product_indices][:, :, region_indices]print(f"\\n3. 花式索引:提取产品{product_indices}在区域{region_indices}的数据")print(f" 形状:{selected_data.shape}") # (30, 2, 3)# 4. 广播机制:简化多维运算print("\\n🔄 广播机制演示:")# 示例:为每个产品设置不同的单价(万元/件)unit_prices = np.array([1.2, 2.5, 3.8]) # 3种产品的单价print(f"产品单价:{unit_prices} 万元/件")# 计算每日销售额(件数 × 单价)# sales_data形状:(30, 3, 5),unit_prices形状:(3,)# 广播规则:将unit_prices扩展为(1, 3, 1),与sales_data相乘daily_revenue = sales_data * unit_prices.reshape(1, 3, 1)print(f"\\n广播运算结果:")print(f" 原始销售数据形状:{sales_data.shape}")print(f" 单价数组形状:{unit_prices.shape}")print(f" 计算后收入数据形状:{daily_revenue.shape}")print(f" 第1天产品1在区域1的:")print(f" 销量:{sales_data[0, 0, 0]:.2f} 件")print(f" 收入:{daily_revenue[0, 0, 0]:.2f} 万元")# 验证广播正确性manual_calc = sales_data[0, 0, 0] * unit_prices[0]print(f" 手动验证:{manual_calc:.2f} 万元(一致√)")# 5. NumPy统计函数:快速洞察数据print("\\n📈 统计函数应用:")# 计算基本统计量print("销售数据统计摘要:")print(f" 均值:{sales_data.mean():.2f} 万元")print(f" 中位数:{np.median(sales_data):.2f} 万元")print(f" 标准差:{sales_data.std():.2f} 万元") # 波动程度print(f" 方差:{sales_data.var():.2f}")print(f" 最小值:{sales_data.min():.2f} 万元")print(f" 最大值:{sales_data.max():.2f} 万元")print(f" 总和:{sales_data.sum():.2f} 万元")print(f" 百分位数(25%, 50%, 75%):{np.percentile(sales_data, [25, 50, 75])}")# 计算相关系数矩阵(产品间相关性)# 将三维数据展平为二维:(30×5, 3) = (150, 3)flattened_data = sales_data.transpose(0, 2, 1).reshape(-1, products)correlation_matrix = np.corrcoef(flattened_data, rowvar=False)print(f"\\n产品间销售相关系数矩阵(3×3):")print(correlation_matrix)# 错误示例:形状(3,)和(4,)无法广播# 正确做法:调整为(3,1)和(1,4)或(4,1)和(3,1)a = np.array([1, 2, 3])b = np.array([4, 5, 6, 7])result = a[:, np.newaxis] + b[np.newaxis, :] # 形状(3,4)reshape()调整数组形状np.newaxis或None添加新维度arr1.shape和arr2.shapearr = np.array([1, 2, 3, 4, 5])view = arr[1:4] # 视图view[0] = 99# arr也会被修改!copy = arr[1:4].copy() # 副本copy[0] = 100# arr不受影响.copy()arr.base is not None表示是视图arr = np.array([[1, 2], [3, 4]])print(arr[0]) # [1, 2] 一维数组print(arr[0:1]) # [[1, 2]] 二维数组arr[0]获取第0行(减少1维)arr[0:1]获取包含第0行的子数组(保持维度)arr[[0]](花式索引)或arr[0:1]np.array()、np.arange()、np.linspace()、np.zeros()、np.ones()等创建方法np.mean()、np.sum()、np.std()等函数快速分析数据分布np.linalg),掌握矩阵分解等高级功能今日话题:你在使用NumPy时遇到过哪些挑战?是广播规则难以掌握,还是数组形状操作容易出错?或者你有什么NumPy高效使用技巧?欢迎在评论区分享你的经验和问题,我们一起讨论解决!
"""数据结构与NumPy入门完整代码整合所有示例,确保可独立运行"""import numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport time# ====================# 1. 环境准备# ====================plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']plt.rcParams['axes.unicode_minus'] = Falsenp.random.seed(2026)print("=" * 70)print("数据结构与NumPy入门完整演示")print("=" * 70)# ====================# 2. 性能对比演示# ====================print("\\n⚡ 性能对比:Python列表 vs NumPy数组")list_data = list(range(1_000_000))start_time = time.time()list_squares = [x ** 2for x in list_data]list_time = time.time() - start_timearray_data = np.array(list_data)start_time = time.time()array_squares = array_data ** 2array_time = time.time() - start_timeprint(f"Python列表耗时:{list_time:.4f} 秒")print(f"NumPy数组耗时:{array_time:.4f} 秒")print(f"NumPy加速比:{list_time/array_time:.1f} 倍")# ====================# 3. 数组创建示例# ====================print("\\n🎯 数组创建方法演示:")# 各种创建方式arr1 = np.array([1, 2, 3, 4, 5])arr2 = np.arange(0, 10, 2)arr3 = np.linspace(0, 1, 5)arr4 = np.zeros((3, 4))arr5 = np.ones((2, 3))arr6 = np.eye(3)print(f"从列表创建:{arr1}")print(f"arange创建:{arr2}")print(f"linspace创建:{arr3}")print(f"全零数组:\\n{arr4}")print(f"全一数组:\\n{arr5}")print(f"单位矩阵:\\n{arr6}")# ====================# 4. 销售数据分析实战# ====================print("\\n💰 销售数据分析实战:")# 生成模拟销售数据days, products, regions = 30, 3, 5sales_data = np.abs(np.random.normal(loc=50, scale=20, size=(days, products, regions)))print(f"数据形状:{sales_data.shape}")print(f"数据类型:{sales_data.dtype}")print(f"平均销售额:{sales_data.mean():.2f} 万元")# 计算统计量daily_total = sales_data.sum(axis=(1, 2))product_monthly = sales_data.sum(axis=(0, 2))region_monthly = sales_data.sum(axis=(0, 1))print(f"\\n月销售总额:{daily_total.sum():.2f} 万元")print(f"各产品月度销售额:{product_monthly}")print(f"各区域月度销售额:{region_monthly}")# ====================# 5. 广播机制演示# ====================print("\\n🔄 广播机制演示:")unit_prices = np.array([1.2, 2.5, 3.8])daily_revenue = sales_data * unit_prices.reshape(1, 3, 1)print(f"广播后收入数据形状:{daily_revenue.shape}")# ====================# 6. 统计函数应用# ====================print("\\n📈 统计摘要:")print(f"均值:{sales_data.mean():.2f}")print(f"标准差:{sales_data.std():.2f}")print(f"最小值/最大值:{sales_data.min():.2f} / {sales_data.max():.2f}")# ====================# 7. 总结报告# ====================print("\\n" + "=" * 70)print("演示完成!核心收获:")print("1. NumPy数组比Python列表快10-100倍")print("2. 掌握数组创建、索引、切片等基本操作")print("3. 理解广播机制,简化多维运算")print("4. 使用统计函数快速洞察数据分布")print("=" * 70)