【发布时间】:2016-03-16 11:26:24
【问题描述】:
我有一个值数组,例如v(例如v=[1,2,3,4,5,6,7,8,9,10])和一个索引数组,例如g(例如g=[0,0,0,0,1,1,1,1,2,2])。
例如,我知道如何以非常简单的方式获取每个组的第一个元素:
import numpy as np
v=np.array([1,2,3,4,74,73,72,71,9,10])
g=np.array([0,0,0,0,1,1,1,1,2,2])
mask=np.concatenate(([True],np.diff(g)!=0))
v[mask]
返回:
array([1, 74, 9])
是否有任何numpythonic 方式(避免显式循环)来获得每个子集的最大值?
测试:
因为我收到了两个很好的答案,一个是 python map,另一个是 numpy 例程,我正在搜索性能最好的,这里有一些时间测试:
import numpy as np
import time
N=10000000
v=np.arange(N)
Nelemes_per_group=10
Ngroups=N/Nelemes_per_group
s=np.arange(Ngroups)
g=np.repeat(s,Nelemes_per_group)
start1=time.time()
r=np.maximum.reduceat(v, np.unique(g, return_index=True)[1])
end1=time.time()
print('END first method, T=',(end1-start1),'s')
start3=time.time()
np.array(list(map(np.max,np.split(v,np.where(np.diff(g)!=0)[0]+1))))
end3=time.time()
print('END second method, (map returns an iterable) T=',(end3-start3),'s')
结果我得到:
END first method, T= 1.6057236194610596 s
END second method, (map returns an iterable) T= 8.346540689468384 s
有趣的是,map 方法的大部分减速是由于list() 调用。如果我不尝试将我的map 结果重新转换为list(但我必须这样做,因为python3.x 返回一个迭代器:https://docs.python.org/3/library/functions.html#map)
【问题讨论】:
标签: python arrays numpy max vectorization