【问题标题】:Adding up values in a 2D array in Python在 Python 中将二维数组中的值相加
【发布时间】:2014-02-04 08:46:53
【问题描述】:

我有一个如下的 numpy 二维数组

gona = array([['a1', 3], ['a2', 5], ['a3', 1], ['a3', 2], ['a3', 1], ['a1', 7]])

这个数组有 2 列

我想要做的是创建一个包含 2 列的数组。第 1 列的行中应该有 'a1' 、 'a2' 、 'a3' 值,第 2 列应该有这些相应值的总和。

new_gona = array([['a1', 10], ['a2', 5], ['a3', 4]])

这里,对应的取值如下。

'a1' : 3 + 7 = 10
'a2' : 5 
'a3' : 1 + 2 + 1 = 4

什么是实现这一目标的简单方法?

【问题讨论】:

  • 我记得上次出现这个问题时,我看到了一个使用 Pandas 的有效解决方案,但我不记得它是什么。也许有更好的搜索技能的人可以找到它。
  • 注意:运行您发布的代码会生成一个 dtype 数组 '|S2'。这意味着整数存储为字符串,而不是 int32 或其他一些合理的 dtype。这可能是个问题。

标签: python arrays python-2.7 numpy


【解决方案1】:

使用 pandas 及其索引魔法:

import pandas as pd
import numpy as np

gona = np.array([['a1', 3], ['a2', 5], ['a3', 1], 
              ['a3', 2], ['a3', 1], ['a1', 7]])

# Create series where second items are data and first items are index
series = pd.Series(gona[:,1],gona[:,0],dtype=np.float)

# Compute sums across index
sums = series.sum(level=0)

# Construct new array in the format you want
new_gona = np.array(zip(sums.index,sums.values))

new_gona
# out[]:
# array([['a1', '10.0'],
#        ['a2', '5.0'],
#        ['a3', '4.0']], 
#       dtype='|S4')

同样值得注意的是np.arrays 只能保存一种数据类型。因此,您需要通过指定dtype=np.float 来纠正字符串和数字类型的混合。如果需要,可以使用np.int

【讨论】:

    【解决方案2】:

    一个 numpy 唯一的解决方案:

    >>> labels, indices = np.unique(gona[:, 0], return_inverse=True)
    >>> sums = np.bincount(indices, weights=gona[:, 1].astype(np.float))
    >>> new_gona = np.column_stack((labels, sums))
    >>> new_gona
    array([['a1', '10'],
           ['a2', '5.'],
           ['a3', '4.']], 
          dtype='|S2')
    

    【讨论】:

      【解决方案3】:
      from collections import defaultdict 
      from operator import itemgetter
      
      sums = defaultdict(int)
      for key, value in gona:
          sums[key] += value
      
      new_gona = sorted(sums.iteritems(), key=itemgetter(0))
      

      作弊?

      【讨论】:

        【解决方案4】:

        然后,列表推导就很容易了:

        def fst(x): return x[0]
        [(a, sum([int(m[1]) for m in gona if a == m[0]])) for a in set(map(fst, gona)) ]    
        

        这是基本的 Python。不涉及图书馆。第一个函数的定义只是避免在 map 结尾处的 lambda 表达式。不过,已经提到的 Pandas 和 NumPy 解决方案似乎都很有趣。两者都 +1!

        【讨论】:

          【解决方案5】:

          您必须围绕 gona 编写一个循环并将 (a1) 作为键存储在字典对象中。当然应该增加价值

          【讨论】:

          • cmets,请提供一个解决方案。没有代码但有逻辑的解释
          猜你喜欢
          • 1970-01-01
          • 2020-12-04
          • 2016-05-29
          • 1970-01-01
          • 2021-12-31
          • 2017-03-15
          • 1970-01-01
          • 2021-11-02
          • 1970-01-01
          相关资源
          最近更新 更多