python - 在 Python 中按特征对数组求和

标签 python arrays numpy sum

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

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) 的数组,该数组具有给定年份疾病的两性绘制总和,有什么想法吗?我还需要能够在数据不完全平方的情况下执行此操作(有些疾病年只有一种性别)。

最佳答案

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 ,你可以这样做:

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())

关于python - 在 Python 中按特征对数组求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7416901/

相关文章:

python - 如何提取与文本文件中的正则表达式匹配的行号

python - SSL 错误握手错误 10054 "WSAECONNRESET"

python - 将现有类别列表中的类别列添加到 pandas 数据框中

python - 如何管理第三方库的函数在一段时间后停止返回值?

c# - 在 C# 中将 4 字节数组转换为 float 的问题

javascript - 将多维数组传递给 Javascript

arrays - 如何将两列元胞数组转换为带有点的矩阵(元胞数组每行的每对元素)MATLAB

python - numpy 多维索引和对角线对称

python - 来自最小值和最大值之间的指数分布的随机整数

python - 使用 numpy/scipy 将 3D 点的最近点投影到 3D 三角形