【问题标题】:Python: 3D list, sum columnsPython:3D 列表,总和列
【发布时间】:2013-09-30 05:07:32
【问题描述】:

基本上,我想对并行列表中的项目求和,如下所示:

[[1, 2, 3, 4],
 [4, 3, 2, 1]] # list of lists (can be more than two)

 [5, 5, 5, 5]  # result

但是, 问题是列表多了一个维度,本质上是“3D”。但我只想总结最里面的对中的第二项:

[[[0, 1], [0, 2], [0, 3], [0, 4]],
 [[1, 4], [1, 3], [1, 2], [1, 1]]]  # add the numbers downward

 [[0, 5], [0, 5], [0, 5], [0, 5]]   # result

每对中的第一个项目可以单独放置。对他们来说,只复制第一行就可以了。


无论如何,我想不出一个好的方法来做到这一点。我找到了这种方式:

l = [[[0, 1], [0, 2], [0, 3], [0, 4]],
     [[1, 4], [1, 3], [1, 2], [1, 1]]] 

s = map(sum, zip(*[[j[1] for j in i] for i in l])) # to be summed
o = [i[0] for i in l[0]] # others

result = [[j for j in i] for i in zip(o, s)]

...但我无法忍受。如果有更好的方法,我将不胜感激。

感谢您的所有脑力劳动!

附:请记住,列表中可以有任意数量的列表,而不仅仅是 2 个!

【问题讨论】:

  • 你看过 numpy 数组和掩码吗?我认为第一部分“我的最终目标..”使问题有点混乱。也许你应该把那部分去掉。

标签: python arrays list matrix


【解决方案1】:

迭代变量可以解包如下:

>>> for x in [[1,2], [3,4]]: print(x)
... 
[1, 2]
[3, 4]
>>> for a,b in [[1,2], [3,4]]: print(a+b)
... 
3
7
>>> for [a,b] in [[1,2], [3,4]]: print(a+b)
... 
3
7

更新

>>> xs = [[[0, 1], [0, 2], [0, 3], [0, 4]],
...       [[1, 4], [1, 3], [1, 2], [1, 1]],
...       [[1, 1], [1, 2], [1, 3], [1, 4]]]
>>> 
>>> [[x[0][0],sum(b for a,b in x)] for x in zip(*xs)]
[[0, 6], [0, 7], [0, 8], [0, 9]]

【讨论】:

  • 我正要发布这个答案:(但我不知道拆包。print [[item[0][0], item[0][1] + item[1][1]] for item in zip(*Data)]
  • 一个 可读 一个班轮!正是我所希望的。我可以把它应用到很多不同的事情上,谢谢。
  • 等一下,很抱歉现在才发现这个,但这只能管理两个列表...我需要一个可以管理任何号码的列表。即,len(xs) 可以超过两个。
  • [[[a for a in x[0]][0], sum(b for a,b in x)] for x in zip(*xs)] 用于实际复制第一行数字,而不仅仅是写零。
【解决方案2】:

使用numpy怎么样?它还可以处理 3 维数组,并通过给定轴 (0) 在 x[:,:,1] 上使用 np.sum 简单地将所需切片相加,并为了保留第一行中的列将它们压缩在一起 (x[0,:,0])

import numpy as np
x = np.array( [[[0, 1], [0, 2], [0, 3], [0, 4]],
               [[1, 4], [1, 3], [1, 2], [1, 1]]] )
zip( x[0,:,0], np.sum( x[:,:,1], axis=0 ) )

【讨论】:

    猜你喜欢
    • 2023-01-12
    • 1970-01-01
    • 2012-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-05
    • 2012-10-31
    相关资源
    最近更新 更多