如何减少列表与numpy数组转换,创建带线性细分的对数刻度?
优化带线性细分的对数刻度生成函数(减少数组/列表转换)
原函数的问题在于频繁在列表和numpy数组之间来回转换,不仅冗余还容易引发类型混淆。下面是全程基于numpy操作的优化版本,彻底避免不必要的类型转换:
import numpy as np def log_linsub(start, end): '''创建从10**start到10**end、带有线性细分的对数刻度''' # 生成1-9的基础刻度数组 base = np.arange(1, 10) # 生成从start到end-1的指数序列 exponents = np.arange(start, end) # 利用numpy广播直接计算所有细分值,得到形状为(9, end-start)的数组 seq = base[:, None] * 10 ** exponents # 扁平化数组后,拼接上最终的10**end刻度 return np.concatenate([seq.flatten(), [10**end]])
关键优化点:
- 用
np.arange直接生成numpy数组,替代range转数组的步骤 - 借助numpy广播机制,一次性计算所有数量级内的线性细分值,不需要用列表推导生成数组列表
- 全程保持numpy数组操作,用
np.concatenate替代列表的append,彻底消除列表与数组的来回转换 - 最终直接返回numpy数组,无需额外类型转换
测试示例:
调用log_linsub(0, 2)会返回:
array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100])
内容的提问来源于stack exchange,提问作者jomurmiranda
相关产品推荐
相关产品推荐

