• mickey 置顶
    2018-12-21
    #!/usr/bin/python
    #vim: set fileencoding:utf-8
    import numpy as np

    '''
    假设一个团队里有5名学员,成绩如下表所示。
    1.用NumPy统计下这些人在语文、英语、数学中的平均成绩、最小成绩、最大成绩、方差、标准差。
    2.总成绩排序,得出名次进行成绩输出。
    '''

    scoretype = np.dtype({
        'names': ['name', 'chinese', 'english', 'math'],
        'formats': ['S32', 'i', 'i', 'i']})

    peoples = np.array(
            [
                ("zhangfei", 66, 65, 30),
                ("guanyu", 95, 85, 98),
                ("zhaoyun", 93, 92, 96),
                ("huangzhong", 90, 88, 77),
                ("dianwei", 80, 90, 90)
            ], dtype=scoretype)

    #print(peoples)

    name = peoples[:]['name']
    wuli = peoples[:]['chinese']
    zhili = peoples[:]['english']
    tili = peoples[:]['math']

    def show(name,cj):
        print name,
        print " |",
        print np.mean(cj),
        print " | ",
        print np.min(cj),
        print " | ",
        print np.max(cj),
        print " | ",
        print np.var(cj),
        print " | ",
        print np.std(cj)

    print("科目 | 平均成绩 | 最小成绩 | 最大成绩 | 方差 | 标准差")
    show("语文", wuli)
    show("英语", zhili)
    show("数学", tili)

    print("排名:")
    ranking =sorted(peoples,cmp = lambda x,y: cmp(x[1]+x[2]+x[3],y[1]+y[2]+y[3]), reverse=True)
    print(ranking)
    展开

    作者回复: 写的不错,大家都可以看下。这里他用到了Python自带的sorted函数,用cmp函数和lambda按照三科成绩之和进行排序,并且设置 reverse=True 进行降序排序

     2
     28
  • 么春‮脸小的你了亲并...
    2019-01-20
    排名第一的同学是用 Python 2 的写法,我用 Python 3 也写一遍,供大家参考。

    # -*- coding: utf-8 -*-
    """
    Created on Sun Jan 20 00:51:28 2019

    @author: Dachun Li
    """
    import numpy as np
    a = np.array([[4,3,2],[2,4,1]])
    print(np.sort(a))
    print(np.sort(a, axis=None))
    print(np.sort(a, axis=0))
    print(np.sort(a, axis=1))

    print("\npart 6 作业\n")

    persontype = np.dtype({
        'names':['name', 'chinese','english','math' ],
        'formats':['S32', 'i', 'i', 'i']})
    peoples = np.array([("ZhangFei",66,65,30),("GuanYu",95,85,98),
           ("ZhaoYun",93,92,96),("HuangZhong",90,88,77),
           ("DianWei",80,90,90)],dtype=persontype)
    #指定的竖列
    name = peoples[:]['name']
    chinese = peoples[:]['chinese']
    english = peoples[:]['english']
    math = peoples[:]['math']
    #定义函数用于显示每一排的内容
    def show(name,cj):
        print('{} | {} | {} | {} | {} | {} '
              .format(name,np.mean(cj),np.min(cj),np.max(cj),np.var(cj),np.std(cj)))

    print("科目 | 平均成绩 | 最小成绩 | 最大成绩 | 方差 | 标准差")
    show("语文", chinese)
    show("英语", english)
    show("数学", math)

    print("排名:")
    #用sorted函数进行排序
    ranking = sorted(peoples,key=lambda x:x[1]+x[2]+x[3], reverse=True)
    print(ranking)

    展开

    作者回复: 我让编辑给你加精

     2
     52
  • Zahputor
    2018-12-21
    老师你好,我想问一下axis=0,axis=1,这个应该怎么理解?看得不是很明白

    作者回复: axis=0 是跨行(纵向),axis=1 是跨列(横向)

    
     40
  • (。•́︿•̀。)面...
    2018-12-21
    percentile那里,50是不是应该是中位数而不是平均数啊?
    
     28
  • Kylin
    2018-12-24
    基本上…没听懂,一脸懵逼的听完了,老师还能抢救一下吗?是缺点什么基础知识?

    作者回复: 联系编辑,加微信群,我和你电话沟通下,制定学习计划。你也可以把你的情况和遇到的问题,写在评论区里。这样我解答,更多人可以看到

     1
     25
  • 何楚
    2018-12-21
    老师你的课程示范代码是 Python 2.x 的,可能有些新手同学用了 Python 3 环境,所以你的 print 导致运行错误,然后他们就卡住了,不知道如何解决。
    
     15
  • Non-constant
    2018-12-21
    一、老师问题的回答:
    1.1 效率比较
        Python中的 list 保存的是对象的指针,因此数据量大时很占内存,所以会慢。
        NumPy 数组存储在一个均匀连续的内存块中,这样数组计算遍历所有的元素,不像列表 list 还需要对内存地址进行查找,从而节省了计算资源,比较快。
    1.2 其他数据类型
        例如字典dict、树、图、等等

    二、我的云笔记链接(基本所有代码都验证了一遍):http://note.youdao.com/noteshare?id=dc330cd14b6a354f34167f8e33774177&sub=39A110D2D15A47189E2D33C0051A6F0E

    三、就我感觉老师你在amin()和amax()那里的解释错了?还是说我理解错了?
    amin()时:
        axis=0所选元素应该是[1,4,7], [2,5,8], [3,6,9],然后再选择每一数组中最小的那个值,也即[1,2,3];
        axis=1所选元素应该是[1,2,3], [4,5,6], [7,8,9],然后再选择每一数组中最小的那个值,也即[1,4,7];
    也就是说,axis=0 是列运算;axis=1 是行运算。
    以下是我的代码验证:
    ------------------------------------------------------------------------------------------------
    import numpy as np

    a = np.array([[1,6,3], [4,5,6], [100,8,9]])

    print(a,'\n')
    print(np.amin(a)) # amin(a) 指的是数组中全部元素的最小值
    print(np.amin(a,axis=0)) # axis=0 轴是把元素看成了 [1,4,100], [6,5,8], [3,6,9] 三个元素
    print(np.amin(a,axis=1),'\n') # axis=1 轴是把元素看成了 [1,6,3], [4,5,6], [100,8,9] 三个元素

    print(np.amax(a))
    print(np.amax(a,axis=0))
    print(np.amax(a,axis=1))

    # amin() 用于计算数组中的元素沿指定轴的最小值
    # amax() 用于计算数组中的元素沿指定轴的最大值
    ------------------------------------------------------------------------------------------------
    结果:
    [[ 1 6 3]
     [ 4 5 6]
     [100 8 9]]

    1
    [1 5 3]
    [1 4 8]

    100
    [100 8 9]
    [ 6 6 100]
    ------------------------------------------------------------------------------------------------

    作业题我今晚再更新在我的云笔记中,以上。
    展开
     1
     13
  • Jie
    2018-12-24
    import sys
    import numpy as np
    persontype = np.dtype({'names':['name','chinese','english','math','total'],'formats':['S32','i','i','i','i']})
    peoples = np.array([('zhangfei',66,65,30,0),('guanyu',95,85,98,0),("zhanyun",93,92,96,0),('huanghzong',90,88,77,0),('dianwei',80,90,90,0)],dtype = persontype)
    peoples[:]['total']= peoples[:]['chinese'] +peoples[:]['english']+peoples[:]['math']
    print (peoples)
    print(peoples.dtype.names)
    for col in peoples.dtype.names:
        if col =='name' or col == 'total' :
            continue
        print ("mean of {}:{}".format(col,np.mean(peoples[:][col])))
        print ("amax of {}:{}".format(col,np.amax(peoples[:][col])))
        print ("amin of {}:{}".format(col,np.amin(peoples[:][col])))
        print ("std of {}:{}".format(col,np.std(peoples[:][col])))
        print ("var of {}:{}".format(col,np.var(peoples[:][col])))

    print(np.sort(peoples,order ='total'))
    展开
    
     8
  • 齐福聪
    2018-12-21
    老师 percentile参数为50的时候 应该取的是中位数而不是平均值 对么
    
     8
  • 杨延平
    2018-12-21
    axis: 沿着它排序数组的轴,如果没有数组会被展开,沿着最后的轴排序, axis=0 按列排序,axis=1 按行排序
    
     8
  • Alex王伟健
    2018-12-21
    看来需要去老师推荐的课学下Python了。。。
    
     7
  • Michael
    2018-12-28
    中文名字的格式写S32时报错
     1
     6
  • 何楚
    2018-12-21
    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-

    import numpy as np
    persontype = np.dtype({
        'names': ['name', 'chinese', 'math', 'english'],
        'formats': ['S32', 'i', 'i', 'i']})
    peoples = np.array([("ZhangFei", 66, 65, 30), ("GuanYu", 95, 85, 98),
                        ("ZhaoYun", 93, 92, 96), ("HuangZhong", 90, 88, 77),
                        ("DianWei", 80, 90, 90)],
                       dtype=persontype)
    for col in peoples.dtype.names:
    # print(col)
        if col is "name":
            continue
        print("mean of {}: {}".format(col, peoples[col].mean()))
        print("min of {}: {}".format(col, peoples[col].min()))
        print("max of {}: {}".format(col, peoples[col].max()))
        print("var of {}: {}".format(col, peoples[col].var()))
        print("std of {}: {}".format(col, peoples[col].std()))

    report = np.empty([0, 0])
    for i in range(peoples.size):
        sum_score = peoples['chinese'][i] + peoples['english'][i] + peoples['math'][i]
        #print(sum_score)
        report = np.append(report, [ sum_score])
    report = -np.sort(-report)
    print("sorted score:")
    print(report)

    怎么在 numpy 里作成绩求和还不是很清楚。另外,想把成绩和名字按排序后打印出来,要用索引,赶时间没研究,等看别人的结果。
    展开

    作者回复: 你在求三科成绩的各种统计指标的时候,写的不错
    你提到的如何在numpy中求和,其实在定义结构数组的时候,可以多定义一列total
    peoples[:]['total'] = peoples[:]['chinese']+peoples[:]['english']+peoples[:]['math']
    然后按照total进行排序即可
    print np.sort(peoples, order='total')

     3
     6
  • 蜉蝣
    2019-03-24
    关于axis参数的问题,我也有点模糊,后来知乎上看到这篇文章,思路清晰多了,也推荐大家看一下:https://zhuanlan.zhihu.com/p/30960190

    作者回复: 多谢蜉蝣分享

    
     5
  • 从未在此
    2018-12-21
    根据我在网上找的学习资料,axis=0,代表跨行;=1代表跨列,这样很容易理解。

    作者回复: 对的 理解正确

     1
     5
  • JingZ
    2018-12-21
    (1)NumPy相对Python更高级和更高效,数组存储在均匀连续的内存块,节约计算资源;矢量化的指针指令和多线程矩阵计算提升计算效率;避免隐氏拷贝,采取就地操作。

    (2)数据结构,Python常用应是array,tuple,list,dictionary,set,其他听过的有stack,graph,hash,heap,tree等~理论待老师深入

    (3)练习题代码,最后一点还需要想一想怎么按总成绩排名输出?感觉代码重复性有点高,有更更简洁的代码?

    import numpy as np

    persontype = np.dtype({
        'names':['name','chinese','english','math'],
        'formats':['S32','i','i','i']})

    peoples = np.array([("ZhangFei",66,65,30),("GuanYu",95,85,98), ("ZhaoYun",93,92,96),("HuangZhong",90,88,77),("DianWei",80,90,90)],dtype=persontype)

    #语文、英语、数学
    chineses = peoples[:]['chinese']
    englishs = peoples[:]['english']
    maths = peoples[:]['math']

    #平均成绩
    print(np.mean(chineses))
    print(np.mean(englishs))
    print(np.mean(maths))

    #最小成绩
    print(np.amin(chineses))
    print(np.amin(englishs))
    print(np.amin(maths))

    #最大成绩
    print(np.amax(chineses))
    print(np.amax(englishs))
    print(np.amax(maths))

    #方差
    print(np.std(chineses))
    print(np.std(englishs))
    print(np.std(maths))

    #标准差
    print(np.var(chineses))
    print(np.var(englishs))
    print(np.var(maths))

    #总成绩排序
    print(np.sort(chineses+englishs+maths))

    #按姓名排序
    print(np.sort(peoples,order='name'))
    展开
    
     4
  • ZHen
    2018-12-21
    轴的那里,把数组按行列写在纸上,axis=0就是按行来取元素,axis=1就是沿着第一列取元素
    1,2,3
    4,5,6
    7,8,9
    axis=1时,取的元素组合就是[1,4,7],[2,5,8],[3,6,9]
     1
     4
  • 离忧
    2018-12-24
    老师定义结构数组,那个s32 是什么意思呢?
     1
     3
  • 抢地瓜的阿姨
    2018-12-22
    Dataframe 即将登场!哈哈哈

    作者回复: 哈哈哈 是的

    
     3
  • 小葱拌豆腐
    2018-12-21
    老师,请问一下您,没学过高数,没接触过计算机语言,要提前去把各种函数搞清楚吗?有没有推荐的办法,书籍,课程?

    作者回复: 我更推荐把我文章里的代码都跑一遍,不明白的地方就留言,效率更高

    
     3
我们在线,来聊聊吧