2017-10-09 72 views
0

假设我有索引的数组:萨姆索引numpy的阵列

I=[0 1 2 3 0 3] 

和数组值:

W=[w0, w1, w2, w3] 

如何可以使用如下制造的向量化numpy的表达式创建阵列X

X = np.zeros(I.max() + 1) 
for i in range(len(I)): 
    X[I[i]] += W[I[i]] 

在上面的例子X=[w0+w0, w1, w2, w3+w3]

+1

是'I'排序? – Psidom

+0

@Psidom这不是,但排序并不困难,结果不会改变;你知道用“I”排序的解决方案吗? – DikobrAz

+1

你能用更新的'I'更新你的结果吗?我不知道你现在想做什么。 – Psidom

回答

1

与重复性对象开始

>>> I = np.r_[0, 1, 2, 3, 0, 3] 
>>> W = np.r_[60, 50, 40, 30, 20, 10] 
>>> M = W[I] 

然后注意,一个具有

>>> W[I] 
array([60, 50, 40, 30, 60, 30]) 
>>> W[W[I]==W] 
array([60, 50, 40, 30]) 
>>> np.unique(W[I], return_counts=True)[1] 
array([2, 1, 1, 2]) 

最后,什么这样做

>>> W[M==W]*np.unique(M, return_counts=True)[1] # X 
array([120, 50, 40, 60]) 

让我们(几乎)做到这一点与字符串

>>> W = np.array(['w0', 'w1', 'w2', 'w3', 'w4', 'w5']) 
>>> M = W[I] 
>>> M 
array(['w0', 'w1', 'w2', 'w3', 'w0', 'w3'], dtype='|S2') 
>>> W[M==W] 
array(['w0', 'w1', 'w2', 'w3'], dtype='|S2') 
>>> np.unique(W[I], return_counts=True)[1] 
array([2, 1, 1, 2]) 

导致心理上认为

>>> [2*'w0', 'w1', 'w2', 2*'w3'] 
+0

但你回答最新的问题,似乎工作,只是想检查它 – DikobrAz

+0

你的答案符合最新的问题,而不是原来的问题,因为[120,50,40,60] == [w0 + w0,w1,w2,w3 + w5],而不是[w0 + w4,w1,w2,w3 + w5],因此在开始 – DikobrAz

+0

时删除您的评论可能是有意义的,尽管如果W没有唯一条目 – DikobrAz