我想要按行索引dat
的2d数组idx
的列之和。下面的示例适用于大型数组,但速度较慢。有办法加快速度吗?
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))
输出
[ 0 6 12]
[ 6 24 42]
[ 9 21 33]
发布于 2018-06-25 15:36:25
方法#1
我们可以利用matrix-multiplication
和np.dot
-
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
-
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]])
发布于 2018-06-25 15:19:47
使用set
对象和ndarray.sum()
方法的更快的方法:
In [216]: for i in set(idx):
...: print(dat[idx == i].sum(axis=0))
...:
[ 0 6 12]
[ 6 24 42]
[ 9 21 33]
执行时间比较:
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)
https://stackoverflow.com/questions/51026162
复制相似问题