有如下csv格式文件中,存储学生各门课程的数据,读取并分析文件中的数据

    姓名 学号 高数 英语 python 物理 java C语言 姓名
    罗明 1217106 95 85 96 88 78 90 罗明
    金川 1217116 85 86 90 70 88 85 金川
    戈扬 1217117 80 90 75 85 98 95 戈扬
    罗旋 1217119 78 92 85 72 95 75 罗旋
    蒋维 1217127 99 88 65 80 85 75 蒋维

    在没有学习Numpy时,我们一般方法是以文本方式读取文件中的数据,转为列表,再对列表中的数据进行格式转化和数据分析。
    读取文件中的数据进行统计分析
    统计分析时,数组须是数值类型
    将原数组中可转为数值型的数据提取出来,重新创建一个数组,以方便后续的统计分析

    1. 导入NumPy
    2. 打开文件
    3. 读文件,去掉行末的换行符,转为列表
    4. 转为6行8列的数组
    5. 输出文件内容

    6. 将成绩提取出来,转为整数,置新数组中
    7. Python平均成绩
    8. Python中位数成绩
    9. Python标准差
    10. 平均成绩

    1. 导入NumPy

    1. import numpy as np

    2. 打开文件
    3. 读文件,去掉行末的换行符,转为列表

    1. import numpy as np
    2. with open('8.5 成绩单数字.csv', 'r', encoding='utf-8') as file:
    3. data = file.read().replace('\n', ',').split(',') # 读取文件中的数据到字符串中
    4. print(data)

    以列表形式输出:

    [‘姓名’, ‘学号’, ‘高数’, ‘英语’, ‘python’, ‘物理’, ‘java’, ‘C语言’, ‘罗明’, ‘1217106’, ‘95’, ‘85’, ‘96’, ‘88’, ‘78’, ‘90’, ‘金川’, ‘1217116’, ‘85’, ‘86’, ‘90’, ‘70’, ‘88’, ‘85’, ‘戈扬’, ‘1217117’, ‘80’, ‘90’, ‘75’, ‘85’, ‘98’, ‘95’, ‘罗旋’, ‘1217119’, ‘78’, ‘92’, ‘85’, ‘72’, ‘95’, ‘75’, ‘蒋维’, ‘1217127’, ‘99’, ‘88’, ‘65’, ‘80’, ‘85’, ‘75’]

    4. 转为6行8列的数组
    5. 输出文件内容

    1. scoreAll = np.array(list(data)).reshape(6, 8) # 将字符串s转成列表,再转为6行8列的数组
    2. print(scoreAll) # 输出数组scoreAll

    转为6行8列的数组:
    [[‘姓名’ ‘学号’ ‘高数’ ‘英语’ ‘python’ ‘物理’ ‘java’ ‘C语言’]
    [‘罗明’ ‘1217106’ ‘95’ ‘85’ ‘96’ ‘88’ ‘78’ ‘90’]
    [‘金川’ ‘1217116’ ‘85’ ‘86’ ‘90’ ‘70’ ‘88’ ‘85’]
    [‘戈扬’ ‘1217117’ ‘80’ ‘90’ ‘75’ ‘85’ ‘98’ ‘95’]
    [‘罗旋’ ‘1217119’ ‘78’ ‘92’ ‘85’ ‘72’ ‘95’ ‘75’]
    [‘蒋维’ ‘1217127’ ‘99’ ‘88’ ‘65’ ‘80’ ‘85’ ‘75’]]

    6. 将成绩提取出来,转为整数,置新数组中

    1. scoreNum = scoreAll[1:, 2:].astype(int) # 将数组scoreAll中非数字字符串部分去掉生成新数组,转整型
    2. print(scoreNum) # 输出数组scoreNum

    成绩数据如下,已经从字符串转为整型:
    [[95 85 96 88 78 90]
    [85 86 90 70 88 85]
    [80 90 75 85 98 95]
    [78 92 85 72 95 75]
    [99 88 65 80 85 75]]

    1. Python平均成绩
      可以对数组进行切片并利用统计函数进行数据分析:
      1. print('python平均成绩为{}'.format(np.average(scoreNum[:, 2]))) #输出python课的平均成绩
      python平均成绩为82.2

    8. Python中位数成绩

    1. print('python成绩中位数为{}'.format(np.median(scoreNum[:, 2]))) #输出python成绩中位数

    python成绩中位数为85.0

    9. Python标准差

    1. print('python成绩标准差为{:.2f}'.format(np.std(scoreNum[:, 2]))) #输出python成绩标准差

    python成绩标准差为11.02

    1. 平均成绩
      1. print('{}同学的平均成绩为{:.2f}'.format(scoreAll[1, 0], np.average(scoreNum[0, 0:])))
      罗明同学的平均成绩为88.67
      scoreAll:
      [[‘姓名’ ‘学号’ ‘高数’ ‘英语’ ‘python’ ‘物理’ ‘java’ ‘C语言’]
      [‘罗明’ ‘1217106’ ‘95’ ‘85’ ‘96’ ‘88’ ‘78’ ‘90’]
      [‘金川’ ‘1217116’ ‘85’ ‘86’ ‘90’ ‘70’ ‘88’ ‘85’]
      [‘戈扬’ ‘1217117’ ‘80’ ‘90’ ‘75’ ‘85’ ‘98’ ‘95’]
      [‘罗旋’ ‘1217119’ ‘78’ ‘92’ ‘85’ ‘72’ ‘95’ ‘75’]
      [‘蒋维’ ‘1217127’ ‘99’ ‘88’ ‘65’ ‘80’ ‘85’ ‘75’]]
      scoreNum
      [[95 85 96 88 78 90]
      [85 86 90 70 88 85]
      [80 90 75 85 98 95]
      [78 92 85 72 95 75]
      [99 88 65 80 85 75]]

    下面看一下利用numpy直接读取文件的方法:

    1. import numpy as np
    2. data = np.genfromtxt('8.5 成绩单数字.csv',dtype =str,delimiter=',',encoding='utf-8')
    3. print(data)

    读取结果为一个Numpy的数组

    1. [['姓名' '学号' '高数' '英语' 'python' '物理' 'java' 'C语言']
    2. ['罗明' '1217106' '95' '85' '96' '88' '78' '90']
    3. ['金川' '1217116' '85' '86' '90' '70' '88' '85']
    4. ['戈扬' '1217117' '80' '90' '75' '85' '98' '95']
    5. ['罗旋' '1217119' '78' '92' '85' '72' '95' '75']
    6. ['蒋维' '1217127' '99' '88' '65' '80' '85' '75']]


    1. datascore = data[1:,2:].astype(int)
    2. print(datascore)

    数据部分转为整数
    [[95 85 96 88 78 90]
    [85 86 90 70 88 85]
    [80 90 75 85 98 95]
    [78 92 85 72 95 75]
    [99 88 65 80 85 75]]

    1. print('{}同学的平均成绩为{:.2f}'.format(data[1,0], np.average(datascore[0,0:])))

    罗明同学的平均成绩为88.67

    可以跳过首行读取数据,这样可以直接将分数数据转为数值型

    1. import numpy as np
    2. data = np.genfromtxt('8.5 成绩单数字.csv',dtype =None,skip_header=1,delimiter=',',encoding='utf-8')
    3. print(data) # 与前面 numpy 数组不同
    4. print(data.ndim) # 1,一维结构化数组
    5. print(data.shape) # (5,)

    numpy中的数组要求数据类型相同,所以此时无法得到数组。
    [(‘罗明’, 1217106, 95, 85, 96, 88, 78, 90)
    (‘金川’, 1217116, 85, 86, 90, 70, 88, 85)
    (‘戈扬’, 1217117, 80, 90, 75, 85, 98, 95)
    (‘罗旋’, 1217119, 78, 92, 85, 72, 95, 75)
    (‘蒋维’, 1217127, 99, 88, 65, 80, 85, 75)]
    访问里面的数据可以用以下方法:

    1. print(data[0]) # ('罗明', 1217106, 95, 85, 96, 88, 78, 90)
    2. print(data[0][0]) # 罗明
    3. print(list(data[0])[2:]) # [95, 85, 96, 88, 78, 90]
    4. print('{}同学的平均成绩为{:.2f}'.format(data[0][0], np.average(list(data[0])[2:])))

    为方便统计,在读取文件时,可以直接对数据进行转置:

    1. import numpy as np
    2. data = np.genfromtxt('8.5 成绩单数字.csv',dtype =None,unpack=True,delimiter=',',encoding='utf-8')
    3. print(data)

    [[‘姓名’ ‘罗明’ ‘金川’ ‘戈扬’ ‘罗旋’ ‘蒋维’]
    [‘学号’ ‘1217106’ ‘1217116’ ‘1217117’ ‘1217119’ ‘1217127’]
    [‘高数’ ‘95’ ‘85’ ‘80’ ‘78’ ‘99’]
    [‘英语’ ‘85’ ‘86’ ‘90’ ‘92’ ‘88’]
    [‘python’ ‘96’ ‘90’ ‘75’ ‘85’ ‘65’]
    [‘物理’ ‘88’ ‘70’ ‘85’ ‘72’ ‘80’]
    [‘java’ ‘78’ ‘88’ ‘98’ ‘95’ ‘85’]
    [‘C语言’ ‘90’ ‘85’ ‘95’ ‘75’ ‘75’]]

    转置后,可以更方便对原来的列数据进行统计:

    1. print(data[4]) # ['python' '96' '90' '75' '85' '65']
    2. print(data[4][1:].astype(int)) # [96 90 75 85 65]
    3. print(sum(data[4][1:].astype(int))) # 411