如何使用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]
使用a
,b
和c
而不使用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]
答案 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