Усреднение по вертикали во вложенных списках - PullRequest
0 голосов
/ 09 ноября 2018

Я пишу программу зачетной книжки, которая устанавливает вложенный список с заданиями в виде столбцов и отдельных учащихся по строкам. Программа должна рассчитать среднее значение для каждого задания и среднее значение для каждого студента. У меня есть среднее по студентам, но теперь я не могу понять, как рассчитать среднее по заданию. Любая помощь будет оценена! # gradebook.py

# Display the average of each student's grade.
# Display tthe average for each assignment.

gradebook = [61, 74, 69, 62, 72, 66, 73, 65, 60, 63, 69, 63, 
62, 61, 64],
         [73, 80, 78, 76, 76, 79, 75, 73, 76, 74, 77, 79, 76, 
78, 72],
         [90, 92, 93, 92, 88, 93, 90, 95, 100, 99, 100, 91, 95, 99, 96],
         [96, 89, 94, 88, 100, 96, 93, 92, 94, 98, 90, 90, 92, 91, 94],
         [76, 76, 82, 78, 82, 76, 84, 82, 80, 82, 76, 86, 82, 84, 78],
         [93, 92, 89, 84, 91, 86, 84, 90, 95, 86, 88, 95, 88, 84, 89],
         [63, 66, 55, 67, 66, 68, 66, 56, 55, 62, 59, 67, 60, 70, 67],
         [86, 92, 93, 88, 90, 90, 91, 94, 90, 86, 93, 89, 94, 94, 92],
         [89, 80, 81, 89, 86, 86, 85, 80, 79, 90, 83, 85, 90, 79, 80],
         [99, 73, 86, 77, 87, 99, 71, 96, 81, 83, 71, 75, 91, 74, 72]]
#make variable for assingment averages
#make a variable for student averages
stu_avg = [sum(row)/len(row) for row in gradebook]
print(stu_avg)
#Assignment Class
class Assignment:
    def __init__(self, name, average):
        self.average = average
        self.name = name
    def print_grade(self):
        print("Assignment", self.name, ":", self.average)
#Student Class
class Student:
    def __init__(self, name, average):
       self.average = average
       self.name = name
    def print_grade(self):
        print("Student", self.name, ":", self.average)
s1 = Student("1", stu_avg[0])
s2 = Student("2", stu_avg[1])
s3 = Student("3", stu_avg[2])
s4 = Student("4", stu_avg[3])
s5 = Student("5", stu_avg[4])
s6 = Student("6", stu_avg[5])
s7 = Student("7", stu_avg[6])
s8 = Student("8", stu_avg[7])
s9 = Student("9", stu_avg[8])
s10 = Student("10", stu_avg[9])

s1.print_grade()
s2.print_grade()
s3.print_grade()
s4.print_grade()
s5.print_grade()
s6.print_grade()
s7.print_grade()
s8.print_grade()
s9.print_grade()
s10.print_grade()

1 Ответ

0 голосов
/ 09 ноября 2018

Вместо использования циклов, давайте использовать матрицы. Они значительно ускоряют вычисления, особенно при работе с большими наборами данных.

Например,

Per student:

[1, 2, 3, 4]       [1]
[4, 5, 6, 6]   x   [1]
[1, 1, 3, 1]       [1]

Per assignment

[1, 2, 3, 4]T      [1]
[4, 5, 6, 6]   x   [1]
[1, 1, 3, 1]       [1]

Первая операция возвращается на сумму студента, а вторая - на сумму теста. Разделите соответственно, чтобы получить среднее значение.

Using numpy

import numpy as np

gradebook = [[61, 74, 69, 62, 72, 66, 73, 65, 60, 63, 69, 63, 62, 61, 64],
         [73, 80, 78, 76, 76, 79, 75, 73, 76, 74, 77, 79, 76, 78, 72],
         [90, 92, 93, 92, 88, 93, 90, 95, 100, 99, 100, 91, 95, 99, 96],
         [96, 89, 94, 88, 100, 96, 93, 92, 94, 98, 90, 90, 92, 91, 94],
         [76, 76, 82, 78, 82, 76, 84, 82, 80, 82, 76, 86, 82, 84, 78],
         [93, 92, 89, 84, 91, 86, 84, 90, 95, 86, 88, 95, 88, 84, 89],
         [63, 66, 55, 67, 66, 68, 66, 56, 55, 62, 59, 67, 60, 70, 67],
         [86, 92, 93, 88, 90, 90, 91, 94, 90, 86, 93, 89, 94, 94, 92],
         [89, 80, 81, 89, 86, 86, 85, 80, 79, 90, 83, 85, 90, 79, 80],
         [99, 73, 86, 77, 87, 99, 71, 96, 81, 83, 71, 75, 91, 74, 72]]


def get_student_average(gradebook):
    number_of_students = len(gradebook[0])
    number_of_assignments = len(gradebook)

    matrix = [1] * number_of_students 
    # [1, 1, 1, 1, ...]. This is 1 * 15. Need to transpose to make it 15*1

    # Converting both to numpy matrices
    matrix = np.array(matrix)
    gradebook = np.array(gradebook)

    # Transposing matrix and multiplying them
    print(gradebook.dot(matrix.T))

def get_assignment_average(gradebook):
    number_of_students = len(gradebook[0])
    number_of_assignments = len(gradebook)

    matrix = [1] * number_of_assignments 
    # [1, 1, 1, ...] . This is 1 * 10. Need to transpose to make it 10*1

    matrix = np.array(matrix)
    gradebook = np.array(gradebook)

    gradebook = gradebook.T
    matrix = matrix.T


    print(gradebook.dot(matrix))

get_student_average(gradebook)
get_assignment_average(gradebook)

Результаты

student_avg -> [ 984 1142 1413 1397 1204 1334  947 1362 1262 1235]
test_avg -> [826 814 820 801 838 839 812 823 810 823 806 820 830 814 804]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...