使用函数方法优化numpy循环

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用函数方法优化numpy循环相关的知识,希望对你有一定的参考价值。

亲爱的,我是Python / Numpy的新手,想知道如何消除循环并为下面的代码提供更好的性能,以进行蒙特卡洛模拟。

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
import pandas as pd

iterations = 3
months = 12
group_size = 5
exit_factor = 0.2
membership_fee = 2


# join delay [periods]
join_delay = np.random.triangular(left=0, mode=4, right=7,
                                  size=(iterations, group_size)).astype(int)
# exit [number of users]
exit_users = np.random.triangular(left=5, mode=10, right=20, 
                                  size=(months, iterations)).astype(int)

sim_table = np.zeros(shape = (iterations, group_size, months), dtype = 'int')
print(join_delay)
for j in range (0, iterations):
  for i in range(0, group_size):
    sim_table[j,i,join_delay[j,i]] = 200
print(sim_table)
答案

使用advanced indexing并进行广播,您可以将200值同时分配给所有索引,而不用使用已设置的for循环:

sim_table[np.arange(iterations)[:, np.newaxis],
          np.arange(group_size)[np.newaxis, :],
          join_delay] = 200

显示速度增益的表:

#              iterations * group_size
#                    15 |      150 |      1500 |    15000 | 150000   | 15000000
# loop [sec]:  3.00e-05 | 1.67e-04 |  1.58e-03 | 1.52e-02 | 6.07e-02 | 4.73e-00
# numpy [sec]: 4.19e-05 | 4.43e-05 |  7.05e-05 | 2.90e-04 | 1.49e-03 | 1.24e-01
# relative:         0.7 |      3.8 |      22.4 |     52.4 |     40.7 |     38.1

以上是关于使用函数方法优化numpy循环的主要内容,如果未能解决你的问题,请参考以下文章

解释numpy向量化函数应用VS python for循环的速度差异

Python:优化循环

快速 Numpy 循环

Python:重写一个循环的 numpy 数学函数以在 GPU 上运行

pandas优化

使用 for 循环和过滤器优化代码