将部分约简累积到numpy中的数组

时间:2018-10-23 06:53:16

标签: python numpy

问题描述

如何使用a索引到c中,将b中的值累加到a中?也就是说,给定

import numpy as np
a = np.zeros(3)
b = np.array([2, 1, 0, 1])
c = np.arange(0.1, 0.5, 0.1)
print ('a=%s b=%s c=%s'.replace(' ', '\n') % (str(a), str(b), str(c)))

输出

a=[ 0.  0.  0.]
b=[2 1 0 1]
c=[ 0.1  0.2  0.3  0.4]

我如何实现

d = np.array([0.3, 0.2 + 0.4, 0.1])
print 'd=%s' % str(d)

输出

d=[ 0.3  0.6  0.1]

使用abc而不使用for循环?

我的解决方案尝试

我可以对b进行排序,然后使用对c进行排序的索引对b进行排序

p = b.argsort()
print ('b[p]=%s c[p]=%s'.replace(' ', '\n') % (str(b[p]), str(c[p])))

输出

b[p]=[0 1 1 2]
c[p]=[ 0.3  0.2  0.4  0.1]

然后将b减少为出现次数

occ = np.bincount(b[p])
print 'occ=%s' % str(occ)

输出

occ=[1 2 1]

并使用它来计算部分和

print np.array([np.sum(c[p][0:occ[0]]),
                np.sum(c[p][occ[0]:occ[0]+occ[1]]),
                np.sum(c[p][occ[0]+occ[1]:occ[0]+occ[1]+occ[2]])])

输出

[ 0.3  0.6  0.1]

如何概括这一点?

所有代码和输出

import numpy as np
a = np.zeros(3)
b = np.array([2, 1, 0, 1])
c = np.arange(0.1, 0.5, 0.1)
print ('a=%s b=%s c=%s'.replace(' ', '\n') % (str(a), str(b), str(c)))
d = np.array([0.3, 0.2 + 0.4, 0.1])
print 'd=%s' % str(d)
p = b.argsort()
print ('b[p]=%s c[p]=%s'.replace(' ', '\n') % (str(b[p]), str(c[p])))
occ = np.bincount(b[p])
print 'occ=%s' % str(occ)
print np.array([np.sum(c[p][0:occ[0]]),
                np.sum(c[p][occ[0]:occ[0]+occ[1]]),
                np.sum(c[p][occ[0]+occ[1]:occ[0]+occ[1]+occ[2]])])

输出

a=[ 0.  0.  0.]
b=[2 1 0 1]
c=[ 0.1  0.2  0.3  0.4]
d=[ 0.3  0.6  0.1]
b[p]=[0 1 1 2]
c[p]=[ 0.3  0.2  0.4  0.1]
occ=[1 2 1]
[ 0.3  0.6  0.1]

2 个答案:

答案 0 :(得分:1)

如果您可以使用熊猫,则在一行中求解:

import pandas as pd
a = pd.DataFrame({'b':b,'c':c}).groupby('b')['c'].sum().reset_index()

输出:

b  c
0 0.3 
1 0.6 
2 0.1 

如果您需要numpy数组,则将nessecery列包装为numpy:

import pandas as pd
a = pd.DataFrame({'b':b,'c':c}).groupby('b')['c'].sum().reset_index()
b = np.array(a['b'])
c = np.array(a['c'])

答案 1 :(得分:1)

hres.sendRedirect("login.html"); 完全满足您的要求:

np.bincount

也有>>> import numpy as np >>> >>> b = [2, 1, 0, 1] >>> c = np.arange(0.1, 0.5, 0.1) >>> c array([0.1, 0.2, 0.3, 0.4]) >>> np.bincount(b, c) array([0.3, 0.6, 0.1]) ,但是除非np.add.at中的更新非常稀疏,否则它的速度要慢得多。

a