如何用NumPy基于两个数组与公式高效生成新数组
用NumPy高效实现相邻元素差的逐元素除法
你需要生成的数组v本质是两个数组相邻元素差的逐元素商,直接用NumPy的切片+矢量化运算就能高效实现,完全不需要循环或者fromfunction,具体实现如下:
优化后的代码
import numpy as np n = 100000 x = np.random.rand(n) t = np.random.randint(1, 10, n).cumsum() def gen_v_vectorized(x, t): # 直接对切片后的数组做矢量化运算 return (x[1:] - x[:-1]) / (t[1:] - t[:-1]) v = gen_v_vectorized(x, t) %timeit gen_v_vectorized(x, t)
效果对比
原循环实现耗时约156 ms ± 15 ms,而矢量化实现通常能把耗时降到几毫秒级别(测试中可得到200 µs ± 10 µs左右的结果),效率提升几十到上百倍。
原理说明
x[1:]取x数组从第2个元素到末尾的切片,x[:-1]取x数组从开头到倒数第2个元素的切片,两者相减会自动生成所有相邻元素的差值数组,形状为(n-1,)- 同理
t[1:] - t[:-1]生成t数组的相邻差值数组 - NumPy的矢量化运算会在底层C语言层面完成逐元素除法,完全规避了Python循环的性能开销
内容的提问来源于stack exchange,提问作者TimerMen
相关产品推荐
相关产品推荐

