我有一个索引可以从一个数组中选择元素。但有时索引可能会重复输入...在这种情况下,我想选择相应的较小值。有可能吗?
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.]]
答案 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的速度。