Python 根据所选值汇总并绘制Ndarray列表

Python 根据所选值汇总并绘制Ndarray列表,python,numpy,matplotlib,histogram,probability-distribution,Python,Numpy,Matplotlib,Histogram,Probability Distribution,我有一份Ndarray的列表: list1 = [t1, t2, t3, t4, t5] 每个t包括: t1 = np.array([[10,0.1],[30,0.05],[30,0.1],[20,0.1],[10,0.05],[10,0.05],[0,0.5],[20,0.05],[10,0.0]], np.float64) t2 = np.array([[0,0.05],[0,0.05],[30,0],[10,0.25],[10,0.2],[10,0.25],[20,0.1],[20,0

我有一份Ndarray的列表:

list1 = [t1, t2, t3, t4, t5]
每个t包括:

t1 = np.array([[10,0.1],[30,0.05],[30,0.1],[20,0.1],[10,0.05],[10,0.05],[0,0.5],[20,0.05],[10,0.0]], np.float64)

t2 = np.array([[0,0.05],[0,0.05],[30,0],[10,0.25],[10,0.2],[10,0.25],[20,0.1],[20,0.05],[10,0.05]], np.float64)

...
现在我想让整个列表得到每个t对应于第一个元素的值的平均值:

t1out = [[0,0.5],[10,(0.1+0.05+0.05+0)/4],[20,(0.1+0.05)/2],[30,0.075]]

t2out = [[0,0.05],[10,0.1875],[20,0.075],[30,0]]

....
生成t_1后。。。t_n,我想绘制每个t的类的概率,其中第一个元素表示类(0,10,20,30),第二个元素表示这些类发生的概率(0.1,0.7,0.15,0)。柱状图或条形图形式的概率分布,如:

plt.bar([classes],[probabilities])

plt.bar([item[0] for item in t1out],[item[1] for item in t1out])

这里有一种使用itertools.groupby的方法:

from statistics import mean
from itertools import groupby

def fun(t):
    s = sorted(t, key=lambda x:x[0])
    return [[k, mean(i[1] for i in v)] for k,v in groupby(s, key=lambda x: x[0])]

fun(t1)

[[0.0, 0.5],
 [10.0, 0.05],
 [20.0, 0.07500000000000001],
 [30.0, 0.07500000000000001]]
并适用于所有阵列:

[fun(t) for t in [t1,t2]]

[[[0.0, 0.5],
  [10.0, 0.05],
  [20.0, 0.07500000000000001],
  [30.0, 0.07500000000000001]],
 [[0.0, 0.05], [10.0, 0.1875], [20.0, 0.07500000000000001], [30.0, 0.0]]]

这是使用NumPy计算的方法:

将numpy导入为np
def按等级平均值(t,等级=无):
#如果要确保
#所有类都在输出中,即使它们
#不在当前t向量中
如果类为“无”:
classes=np.unique(t[:,0])
bins=np.r_[classes,classes[-1]+1]
h、 直方图(t[:,0],箱)
d=np.数字化(t[:,0],箱子,右=真)
out=np.zero(len(类),t.dtype)
np.add.at(out,d,t[:,1])
out/=h.clip(最小值=1)
返回np.c_[classes,out]
t1=np.数组([[10,0.1],[30,0.05],[30,0.1],
[20, 0.1 ], [10, 0.05], [10, 0.05],
[ 0, 0.5 ], [20, 0.05], [10, 0.0 ]],
dtype=np.64)
打印(按类别(t1)平均)
# [[ 0.     0.5  ]
#  [10.     0.05 ]
#  [20.     0.075]
#  [30.     0.075]]
作为补充说明,将类值(即整数)存储在浮点数组中可能不是最佳选择。你可以考虑用A代替,比如这样:

将numpy导入为np
def按等级平均值(t,等级=无):
如果类为“无”:
classes=np.unique(t['class'])
bins=np.r_[classes,classes[-1]+1]
h、 _uuNP.柱状图(t['class'],箱)
d=np.数字化(t['class'],bins,右=True)
out=np.zero(len(类),t.dtype)
out['class']=类
np.add.at(out['p'],d,t['p'])
out['p']/=h.clip(最小值=1)
返回
t1=np.数组([(10,0.1),(30,0.05),(30,0.1),
(20, 0.1 ), (10, 0.05), (10, 0.05),
( 0, 0.5 ), (20, 0.05), (10, 0.0 )],
数据类型=[('class',np.int32),('p',np.float64)])
打印(按类别(t1)平均)
# [( 0, 0.5  ) (10, 0.05 ) (20, 0.075) (30, 0.075)]

我不明白您是如何生成
t1out
等的。您能更好地解释一下吗?另外,t数组的形状是否相同?问题是如何生成
t1out
's=)请参见下面的好答案如何生成它们,是的,所有t数组的形状都相同。除此之外,对于列表,它将是
[列表1中t的乐趣(t)]