2017-07-17 27 views
0

我对一个程序的有效性进行了基准测试,该程序一直运行到找到解决方案并尝试创建图表以显示程序如何趋于寻找解决方案。该计划有时需要500次尝试,有时需要2000次,我可以证明他们都能稳定地产生更好更好的答案,直到他们找到目标为止。我有数百个运行来检查,所以我想看看所有运行的平均值是如何随时间变化的,然而,numpy不允许我平均不同长度的数据。我怎样才能得到它只是平均每个测试编号可用的数据点。如何绘制死亡样本的数据?

EX:trial1 = [33.4853,32.3958,30.2859,33.2958,30.1049,29.3209]

trial2 = [45.2937,44.2983,42.2839,42.1394,41.2938,39.2936,38.1826,36.2483,39.2632,37.1827,35.9936, 32.4837,31.5599,29.3209]

BE = numpy.array([trial1,trial2])

BEave = numpy.average(BE,轴= 0)

我想取回:BEave = [39.3895,38.34705,36.2849,37.7176,35.69935,34.30725,38.1826,36.2483,39.2632 ,37.1827,35.9936,32.4837,31.5599,29.3209]]

+0

你必须在你的例子错别字和错误。你能解决它们吗? – jacoblaw

+0

目前还不清楚两个不同长度的阵列实际上的平均值是多少。你能提供一个简单的例子**和预期的输出**吗? – ImportanceOfBeingErnest

+0

从你的问题陈述的数据大小它似乎不需要numpy - 列表(可变长度)列表应该没事 – f5r5e5d

回答

0

您可以创建一个nans大数组并填充试验的相应最大试验次数。阵列行的其余部分将保留nan。然后沿着垂直轴取平均值,使用numpy.nanmean

import numpy as np 
import matplotlib.pyplot as plt 

trial1 = [33.4853, 32.3958, 30.2859, 33.2958, 30.1049, 29.3209] 

trial2 = [45.2937, 44.2983, 42.2839, 42.1394, 41.2938, 39.2936, 38.1826, 
      36.2483, 39.2632, 37.1827, 35.9936, 32.4837, 31.5599, 29.3209] 

m= np.max([len(trial1), len(trial2)]) 

# create array of nans 
BE = np.ones((2, m))*np.nan 
# fill it with trials up to the number of trial values 
BE[0,:len(trial1)] = trial1 
BE[1,:len(trial2)] = trial2 

# nanmean = take mean, ignore nans 
BEave = np.nanmean(BE, axis=0) 

plt.plot(trial1, label="trial1", color="mediumpurple") 
plt.plot(trial2, label="trial2", color="violet") 
plt.plot(BEave, color="crimson", label="avg") 

plt.legend() 
plt.show() 

enter image description here

+0

谢谢。是否还有一种方法可以从每一步中获得最佳和最差?我希望能够在图表上显示最佳,最差和平均值。 –

+0

如果“最好”和“最差”是指最小和最大值,numpy也有'nanmin'和'nanmax'方法。 – ImportanceOfBeingErnest