Numpy 基于索引组合二维数组中的值



我有一个基于这种格式的 numpy 数组[[x,y],[x,y]...],我想结合x相同的y

示例array = [[0,0],[1,1],[2,4],[4,6],[2,2],[3,7],[1,9],[4,16],[5,1],[5,2],[0,0]]

我希望这变得newArray = [[0,0],[1,10],[2,6],[3,7],[4,22],[5,3]]- 它不必订购

好像现在我想不出一种简单有效地做到这一点的方法,它可能有助于添加我的实际数组使用时间戳作为我的x值,例如Timestamp('2018-05-05 00:00:00')并且大小183083,这还不错。

任何帮助都得到认可!

如果性能有问题,可以使用纯numpy解决方案: 在 numpy 中按数字对数组求和

下面是使用collections.defaultdict的基于字典的方法。这通过迭代数组中的每一行并按键对值求和来工作。

import numpy as np
from collections import defaultdict
A = np.array([[0,0],[1,1],[2,4],[4,6],[2,2],[3,7],[1,9],[4,16],[5,1],[5,2],[0,0]])
d = defaultdict(int)
for i, j in A:
d[i] += j
res = np.array(sorted(d.items()))
print(res)
array([[ 0,  0],
[ 1, 10],
[ 2,  6],
[ 3,  7],
[ 4, 22],
[ 5,  3]])

下面是一个使用collections.Counter

import numpy as np
from collections import Counter
ar = np.array([[0,0],[1,1],[2,4],[4,6],[2,2],[3,7],[1,9],[4,16],[5,1],[5,2],[0,0], [20,0]])
repeated = [item for item, count in Counter(ar[:,0]).iteritems() if count > 1]
non_repeated = [item for item in range(len(ar)) if item not in repeated]
new_arr = []
for element in repeated:
new_arr.append(np.sum(ar[np.where(ar[:,0]==element)],axis=0))
new_arr = np.asanyarray(new_arr)
new_arr[:,0] = new_arr[:,0]/2.
new_arr = ar[non_repeated]

这是一个典型的分组操作。 numoy 不支持这些开箱即用的,但 numpy 索引包支持(免责声明:我是它的作者):

import numpy_indexed as npi
keys, sums = npi.group_by(A[:, 0]).sum(A[:, 1])

这个解决方案以完全矢量化的方式工作;所以在python中没有for循环到数组,并且还推广到许多其他场景。它可以使用 pip 或 conda 安装。

最新更新