使用函数方法优化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循环的速度差异