【问题标题】:Create new list with copied and averaged items from old list使用旧列表中的复制和平均项目创建新列表
【发布时间】:2013-11-20 17:31:03
【问题描述】:

我有一个由几个子列表组成的主列表,这些子列表又由子列表组成(即:子子列表)这是我的意思的一个最小示例:

a = [[[0,1,2,3], [0,4,5,6]], [[1,1,2,7], [1,4,5,8]], [[2,1,2,9], [2,4,5,10]]]

注意每个子子列表中的0项表示其所在子列表的索引,12项在每个子子列表中的两个子子列表中是等价的子列表和第三项不同。

我需要基于该列表创建一个新列表,方法是省略零项,然后从每个子子列表(相等)复制项目12,最后平均第三项。所以新列表看起来像这样:

b = [[1,2,6.33], [4,5,8.]]

在零项消失的地方,12 项只是被复制,第三项在子子列表中平均:

6.33 = (3+7+9)/3
8. = (6+8+10)/3

我确信这可以使用zipnp.mean 完成,但我无法完成。顺便说一句,我可以接受不使用这些工具的答案,这只是我对答案可能在哪里的直觉。

【问题讨论】:

    标签: python list numpy average


    【解决方案1】:

    我认为这可行:

    a = [[[0,1,2,3], [0,4,5,6]], [[1,1,2,7], [1,4,5,8]], [[2,1,2,9], [2,4,5,10]]]
    arr = np.asarray(a)
    
    b =  arr[:, :, 1:].mean(0)
    

    这取决于子列表的12 项是相同的,因此它们的平均值不会改变。

    >>> b
    array([[ 1.        ,  2.        ,  6.33333333],
           [ 4.        ,  5.        ,  8.        ]])
    

    【讨论】:

    • 惊人的答案,比我预期的还要简单。 Nitpick:你怎么能把平均数字四舍五入到小数点后 3 位?谢谢!
    • 你可以使用np.round(b, 3)
    • 这不是围绕整个数组吗?我只需要将第三项四舍五入(我的真实清单比我在问题中提出的要复杂得多)
    • 是的,它会舍入整个数组。要做到这一点,只需将最后一列传递给np.round,并将最后一列作为输出:np.round(b[:,-1], 3, b[:,-1])
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-02-02
    • 2015-06-11
    • 2022-01-17
    • 2017-10-17
    • 2020-01-25
    • 1970-01-01
    • 2015-07-15
    相关资源
    最近更新 更多