ndarray имена полей как для строки, так и для столбца?

Я учитель информатики, пытаюсь создать для себя небольшой журнал с помощью NumPy. Но я думаю, что мой код было бы легче писать, если бы я мог создать ndarray, который использует имена полей как для строк, так и для столбцов. Вот что у меня есть на данный момент:

import numpy as np
num_stud = 23
num_assign = 2
grades = np.zeros(num_stud, dtype=[('assign 1','i2'), ('assign 2','i2')]) #etc
gv = grades.view(dtype='i2').reshape(num_stud,num_assign)

Итак, если мой первый ученик получит 97 баллов за задание 1, я могу написать любое из:

grades[0]['assign 1'] = 97
gv[0][0] = 97

Кроме того, я могу сделать следующее:

np.mean( grades['assign 1'] ) # class average for assignment 1
np.sum( gv[0] ) # total points for student 1

Все это работает . Но я не могу понять, как это сделать, так это использовать идентификационный номер студента для обозначения конкретного студента (предположим, что у двух моих учеников есть идентификаторы, как показано):

grades['123456']['assign 2'] = 95
grades['314159']['assign 2'] = 83

... или может быть, создать второе представление с другими именами полей?

np.sum( gview2['314159'] ) # total points for the student with the given id

Я знаю, что могу создать dict, отображающий идентификаторы учащихся в индексы, но это кажется хрупким и грубым, и я надеюсь, что есть способ лучше, чем:

id2i = { '123456': 0, '314159': 1 }
np.sum( gv[ id2i['314159'] ] )

Я также готов переделывать вещи, если будет более чистый дизайн. Я новичок в NumPy, и я еще не написал много кода, так что если я делаю это неправильно, не исключено, что начать заново.

Я буду нуждаться в суммировать все баллы за задания для более чем сотни студентов один раз в день, а также выполнять стандартные отклонения и другую статистику. Кроме того, я буду ждать результатов, поэтому я бы хотел, чтобы он прошел всего за пару секунд.

Заранее благодарим за любые предложения.

7
задан Graham Mitchell 11 October 2010 в 22:08
поделиться