首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Python中按特征对数组求和

在Python中按特征对数组求和
EN

Stack Overflow用户
提问于 2011-09-14 21:15:01
回答 2查看 353关注 0票数 1

我想知道根据给定的特征对数组元素求和的最有效方法是什么。例如,我有1000个数据,我要找的是给定年份的性别(列)中每一次绘制的总和-疾病(即,绘制是按性别、年份、疾病绘制的,我想要每一年的性别和疾病的总和)。

代码语言:javascript
运行
复制
import numpy as np
year = np.repeat((1980, 1990 , 2000, 2010), 10)
sex = np.array(['male', 'female']*20)
disease = np.repeat(('d1', 'd2', 'd3', 'd4', 'd5', 'd6', 'd7', 'd8'), 5)
draws = np.random.normal(0, 1, size=(sex.shape[0], 1000))

你有没有想过如何得到一个形状为(20,1000)的数组,这个数组包含给定年份男女之间的总和--疾病?我还需要能够在数据不完全平方的情况下做到这一点(有疾病年份只有一次性行为)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-09-14 21:56:12

代码语言:javascript
运行
复制
import numpy as np
import itertools   
import csv

year = np.repeat((1980, 1990 , 2000, 2010), 10)
sex = np.array(['male', 'female']*20)
disease = np.repeat(('d1', 'd2', 'd3', 'd4', 'd5', 'd6', 'd7', 'd8'), 5)
draws = np.random.normal(0, 1, size=(sex.shape[0], 1000))

years=np.unique(year)
diseases=np.unique(disease)

draw_sums = dict(((y,d), draws[(year==y)&(disease==d)].sum(axis=0)) 
                  for y,d in itertools.product(years,diseases))

这导致了将每个(年份,疾病)与相应的抽奖和相关联的字典。要将draw_sums写入csv,您可以这样做:

代码语言:javascript
运行
复制
with open('/tmp/test.csv','w') as f:
    writer=csv.writer(f)
    writer.writerow(['year', 'date']+['draw{i}'.format(i=i) for i in range(1,1001)])
    for yeardate,draws in sorted(draw_sums.items()):
        writer.writerow(list(yeardate)+draws.tolist())
票数 1
EN

Stack Overflow用户

发布于 2016-04-03 02:53:44

这是一个典型的group-by问题,可以使用numpy_indexed包以完全矢量化的方式有效地解决(免责声明:我是它的作者)

代码语言:javascript
运行
复制
keys, values = npi.group_by((year, disease)).sum(draws)
for key, value in zip(zip(*keys), values):
    print(key, value.shape)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7416901

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档