首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >按索引总结2天

按索引总结2天
EN

Stack Overflow用户
提问于 2018-06-25 14:43:15
回答 2查看 53关注 0票数 1

我想要按行索引dat的2d数组idx的列之和。下面的示例适用于大型数组,但速度较慢。有办法加快速度吗?

代码语言:javascript
运行
复制
import numpy as np

dat = np.arange(18).reshape(6, 3, order = 'F')
idx = np.array([0, 1, 1, 1, 2, 2])

for i in np.unique(idx):
    print(np.sum(dat[idx==i], axis = 0))

输出

代码语言:javascript
运行
复制
[ 0  6 12]
[ 6 24 42]
[ 9 21 33]
EN

回答 2

Stack Overflow用户

发布于 2018-06-25 15:36:25

方法#1

我们可以利用matrix-multiplicationnp.dot -

代码语言:javascript
运行
复制
In [56]: mask = idx[:,None] == np.unique(idx)

In [57]: mask.T.dot(dat)
Out[57]: 
array([[ 0,  6, 12],
       [ 6, 24, 42],
       [ 9, 21, 33]])

方法#2

对于idx已经排序的情况,我们可以使用np.add.reduceat -

代码语言:javascript
运行
复制
In [52]: p = np.flatnonzero(np.r_[True,idx[:-1] != idx[1:]])

In [53]: np.add.reduceat(dat, p, axis=0)
Out[53]: 
array([[ 0,  6, 12],
       [ 6, 24, 42],
       [ 9, 21, 33]])
票数 2
EN

Stack Overflow用户

发布于 2018-06-25 15:19:47

使用set对象和ndarray.sum()方法的更快的方法:

代码语言:javascript
运行
复制
In [216]: for i in set(idx):
     ...:     print(dat[idx == i].sum(axis=0))
     ...:     
[ 0  6 12]
[ 6 24 42]
[ 9 21 33]

执行时间比较:

代码语言:javascript
运行
复制
In [217]: %timeit for i in np.unique(idx): r = np.sum(dat[idx==i], axis = 0)
109 µs ± 1.1 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

In [218]: %timeit for i in set(idx): r = dat[idx == i].sum(axis=0)
71.1 µs ± 1.98 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51026162

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档