我有一个基于这种格式的 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 安装。