使用matplotlib.animation与LineCollection时,如何缩减colors列表体积?
解决Matplotlib动画中颜色列表内存占用过高的方案
1. 整数映射颜色字符串
用整数代替重复的颜色字符串,通过字典映射还原。这种方法内存占用极低,且实时添加数据时无需解压操作:
- 定义颜色映射字典:
color_map = {0: 'blue', 1: 'green', 2: 'red'} - 将原颜色列表
['blue','blue',...,'green','green']替换为整数列表[0,0,...,1,1] - 绘制时直接通过索引取颜色:
color = color_map[color_index] - 新增数据时,直接添加对应颜色的整数即可,无需处理字符串重复存储
2. 用Numpy数组存储整数索引
如果数据量极大,用Numpy的低精度整数数组进一步压缩内存:
- 导入Numpy并创建数组:
import numpy as np # 用uint8类型(0-255)足够存储最多256种颜色 color_indices = np.array([0,0,1,1,2,2], dtype=np.uint8)
- 这种方式每个元素仅占1字节,远低于字符串的内存开销,且Numpy数组的读写效率更高
- 新增数据时,直接用
np.append或预分配数组扩展,绘制时同样通过字典映射颜色
3. 按连续颜色段存储
如果颜色是连续重复的(比如连续N条蓝色线段,再M条绿色线段),可以用"计数+颜色"的元组列表存储:
- 原列表
['blue']*1000 + ['green']*500可简化为[(1000, 'blue'), (500, 'green')] - 新增数据时:
- 检查最后一段的颜色是否与新颜色相同,相同则更新计数(比如最后一段是(1000, 'blue'),新增50条蓝色线段,就改成(1050, 'blue'))
- 不同则添加新的元组(比如新增红色线段,就追加
(30, 'red'))
- 绘制时,仅需要处理新增的线段部分,无需展开整个列表,既省内存又减少计算量
内容的提问来源于stack exchange,提问作者THATS MY QUANT MY QUANTITATIVE
相关产品推荐
相关产品推荐

