Cha*_*hau 8 python arrays performance numpy matrix
我有两个2D numpy数组(在这个例子中简化了大小和内容),大小相同.
ID矩阵:
1 1 1 2 2
1 1 2 2 5
1 1 2 5 5
1 2 2 5 5
2 2 5 5 5
Run Code Online (Sandbox Code Playgroud)
和一个价值矩阵:
14.8 17.0 74.3 40.3 90.2
25.2 75.9 5.6 40.0 33.7
78.9 39.3 11.3 63.6 56.7
11.4 75.7 78.4 88.7 58.6
79.6 32.3 35.3 52.5 13.3
Run Code Online (Sandbox Code Playgroud)
我的目标是对来自第一个矩阵的ID分组的第二个矩阵的值进行计数和求和:
1: (8, 336.8)
2: (9, 453.4)
5: (8, 402.4)
Run Code Online (Sandbox Code Playgroud)
我可以在for循环中执行此操作,但是当矩阵的大小为数千而不是仅仅5x5和数千个唯一ID时,处理需要花费大量时间.
这样做numpy有一个聪明的方法或方法的组合吗?
这是一个矢量化方法,通过组合和得到计数ID和ID-based求和值-valuenp.uniquenp.bincount
unqID,idx,IDsums = np.unique(ID,return_counts=True,return_inverse=True)
value_sums = np.bincount(idx,value.ravel())
Run Code Online (Sandbox Code Playgroud)
要将最终输出作为字典,您可以使用循环理解来收集求和值,如下所示 -
{i:(IDsums[itr],value_sums[itr]) for itr,i in enumerate(unqID)}
Run Code Online (Sandbox Code Playgroud)
样品运行 -
In [86]: ID
Out[86]:
array([[1, 1, 1, 2, 2],
[1, 1, 2, 2, 5],
[1, 1, 2, 5, 5],
[1, 2, 2, 5, 5],
[2, 2, 5, 5, 5]])
In [87]: value
Out[87]:
array([[ 14.8, 17. , 74.3, 40.3, 90.2],
[ 25.2, 75.9, 5.6, 40. , 33.7],
[ 78.9, 39.3, 11.3, 63.6, 56.7],
[ 11.4, 75.7, 78.4, 88.7, 58.6],
[ 79.6, 32.3, 35.3, 52.5, 13.3]])
In [88]: unqID,idx,IDsums = np.unique(ID,return_counts=True,return_inverse=True)
...: value_sums = np.bincount(idx,value.ravel())
...:
In [89]: {i:(IDsums[itr],value_sums[itr]) for itr,i in enumerate(unqID)}
Out[89]:
{1: (8, 336.80000000000001),
2: (9, 453.40000000000003),
5: (8, 402.40000000000003)}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
145 次 |
| 最近记录: |