如何使用Numpy优化数组生成代码?替代嵌套循环的最佳实践
用NumPy替代嵌套循环生成目标数组
我用嵌套循环生成了如下的8×5数组,但感觉这种写法不够规范,想知道能不能用NumPy的内置函数替代循环,有没有更高效的NumPy使用方式?
目标输出:
[[ 1. 1.5 2. 2.5 3. ] [ 3.5 4. 4.5 5. 5.5] [ 6. 6.5 7. 7.5 8. ] [ 8.5 9. 9.5 10. 10.5] [11. 11.5 12. 12.5 13. ] [13.5 14. 14.5 15. 15.5] [16. 16.5 17. 17.5 18. ] [18.5 19. 19.5 20. 20.5]]
当前使用的代码:
import numpy as np list = [] x = 0.5 for i in range(8): temp = [] list.append(temp) for j in range(5): x += 0.5 temp.append(x) array = np.array(list)
当然可以用NumPy的向量化操作完全替代嵌套循环,下面是几种更优的实现方式,都比循环写法更简洁高效:
方法1:np.arange + reshape
这是最直接的方式,先生成连续的数值序列,再重塑成目标形状:
import numpy as np array = np.arange(1.0, 21.0, 0.5).reshape(8, 5)
np.arange(1.0, 21.0, 0.5)会生成从1.0开始、步长0.5、直到小于21.0的序列(刚好到20.5),然后用reshape(8,5)把一维数组转成8行5列的二维数组。
方法2:np.linspace + reshape
如果更关注元素总数而非步长,可以用linspace生成指定数量的均匀分布数值:
import numpy as np array = np.linspace(1.0, 20.5, 8*5).reshape(8,5)
np.linspace(1.0, 20.5, 40)会生成从1.0到20.5之间的40个均匀间隔的数值,再重塑成目标形状。
方法3:利用广播机制
通过构造行起始值和列增量,利用NumPy的广播特性生成数组:
import numpy as np row_starts = np.arange(1.0, 19.0, 2.5) # [1.0, 3.5, 6.0, ..., 18.5] cols = np.arange(0, 5)*0.5 # [0., 0.5, 1., 1.5, 2.] array = row_starts[:, np.newaxis] + cols
先生成每一行的起始值数组,再通过[:, np.newaxis]把它转成列向量,然后和列增量数组广播相加,自动生成每行的数值。
这些方法的优势:
- 避免Python层面的循环,利用NumPy的C底层实现,处理大规模数据时效率提升明显;
- 代码简洁直观,生成逻辑一目了然;
- 符合NumPy向量化编程范式,减少手动循环的出错概率。
内容的提问来源于stack exchange,提问作者soosius
相关产品推荐
相关产品推荐

