我有
形式的数据Ns0 = [ 2 3 1 2 2 3 4 5 3 1 2 ]
As0 = [ 9 2 4 5 4 3 1 2 0 8 2 ]
我想创建Ns = [ 1 2 3 4 5 ]
以及As_avg
,这是As0
相关Ns0
中所有项目的平均值。
我知道我可以使用Ns
制作Ns = list(set(Ns0))
,我希望通过以下方式制作As_avg
:
for N in Ns:
As_avg.append( np.mean( np.array( [a for a in As0 if ??? ] ) ) )
但是我被困在???
部分。如何在a
中选择与As0
中的N
对应的Ns0
?
我知道我可以通过以下方式做到这一点:
for N in Ns:
tlist = []
for (tN, tA) in zip(Ns0, As0):
if( tN == N ):
tlist.append(tA)
As_avg.append( np.mean( np.array( tlist ) ) )
但是我希望有更多的pythonic方式来做这个
答案 0 :(得分:4)
for N in Ns:
As_avg.append( np.mean( np.array( [tA for tN, tA in zip(Ns0, As0) if tN == N] ) ) )
但是不要试图成为“pythonic”'如果是可读性的权衡。我个人更喜欢2循环版本。
答案 1 :(得分:0)
您可以使用词典保留预期的项目,其中的密钥是Ns0
中的唯一项目,值是As0
中相应项目的列表,然后对值应用np.mean
使用map
函数:
>>> d = {}
>>>
>>> for i,j in zip(Ns0, As0):
... d.setdefault(i, []).append(j)
...
>>> map(np.mean, d.values())
[6.0, 5.0, 1.6666666666666667, 1.0, 2.0]
注意这种方法的优点是您不必从Ns0
创建唯一项目列表,然后您可以简单地使用一个循环。
答案 2 :(得分:0)
请记住,可读性是关键的Python值https://www.python.org/dev/peps/pep-0020/
之一列表和字典理解对此可能很有用,但如果它们变得太复杂,则会使它难以阅读,您应该将它们分成多行。
我认为这就是解决问题的方法:
common_vals = [A_val for A_val, N_val in zip(As0, Ns0) if A_val == N_val]
As_avg = np.mean(np.asarray(common_vals))
我假设您只希望common_vals
包含两个列表中显示的值,并且AND显示在同一位置。如果您只想要出现在两个列表中的值:
common_vals = [val for val in As0 if val is in Ns0]
我还要指出,变量名中的大写字母在Python中通常很糟糕,因为它违反了PEP8样式指南https://www.python.org/dev/peps/pep-0008/如果你正在处理矩阵我可以理解大写字母有时会更有意义,但是:)
希望这有帮助!