使用具有多个值的索引,如何获得最小值

时间:2013-12-06 08:47:01

标签: python numpy

我有一个索引可以从一个数组中选择元素。但有时索引可能会重复输入...在这种情况下,我想选择相应的较小值。有可能吗?

index = [0,3,5,5]
dist = [1,1,1,3]
arr = np.zeros(6)
arr[index] = dist
print arr

我得到了什么:

[ 1.  0.  0.  1.  0.  3.]

我想得到什么:

[ 1.  0.  0.  1.  0.  1.]

附录

实际上我有第三个数组,要插入(矢量)值。因此,问题是将values的值插入位置arr的{​​{1}},如下所示。但是,当多个值具有相同的索引时,我想选择与最小index对应的值。

dist

我明白了:

index = [0,3,5,5]
dist = [1,1,1,3]
values = np.arange(8).reshape(4,2)
arr = np.zeros((6,2))
arr[index] = values
print arr

我想得到:

 [[ 0.  1.]
 [ 0.  0.]
 [ 0.  0.]
 [ 2.  3.]
 [ 0.  0.]
 [ 6.  7.]]

2 个答案:

答案 0 :(得分:1)

在pandas中使用groupby

import pandas as pd
index = [0,3,5,5]
dist = [1,1,1,3]
s = pd.Series(dist).groupby(index).min()
arr = np.zeros(6)
arr[s.index] = s.values
print arr

答案 1 :(得分:1)

如果index已排序,则可以使用itertools.groupby对该列表进行分组。

np.array([(g[0],min([x[1] for x in g[1]])) for g in 
    itertools.groupby(zip(index,dist),lambda x:x[0])])

产生

array([[0, 1],
       [3, 1],
       [5, 1]])

这比使用np.unique的版本慢约8倍。所以N=1000类似于Pandas版本(我猜是因为我的Pandas导入有些麻烦)。对于较大的N,Pandas版本更好。看起来Pandas方法具有很大的启动成本,这限制了它对小N的速度。