python中的元组到3D矩阵

时间:2016-09-19 12:25:15

标签: python

我在python中有一个列表列表,其中包含具有不同课程和级别的游戏中的用户分数。我的元组(用户,课程,级别,分数)。我有20个用户4个课程和10个级别。我想要的是创建一个3D矩阵,它将具有维度用户 - 课程级别和价值用户分数。我的元组如下:

(110, u'Math', 1, 5)
(110, u'Sports', 1,  5)
(110, u'Geography', 1, 10)
(112, u'History', 1,  9)
(112, u'History', 2,  10)
... ... ... ... ... ... ..

如何创建3D矩阵(在我没有数据的字段中加零)?

1 个答案:

答案 0 :(得分:1)

如果您确实需要该表单中的数据,您可以执行以下操作:

data = [(110, 'Math', 1, 5),
(110, 'Sports', 1,  5),
(110, 'Geography', 1, 10),
(112, 'History', 1,  9),
(112, 'History', 2,  10)] #I'm using Python 3 -- u'' is superfluous

dataDict = {(x,y,z):w for x,y,z,w in data}

users = [110,112] #extend as needed. Also -- easily grabbed by code
subjects = ['Math', 'Sports', 'Geography', 'History'] #etc
levels = [1,2] #etc.

#first create a matrix of the right shape initialized to zeros:

dataMatrix = [[[0 for k in range(len(levels))] for j in range(len(subjects))] for i in range(len(users))]

#then load the nonzeros:

for i,u in enumerate(users):
    for j,s in enumerate(subjects):
        for k,l in enumerate(levels):
            if (u,s,l) in dataDict: dataMatrix[i][j][k] = dataDict[u,s,l]

要查看它,请执行以下操作:

>>> for layer in dataMatrix: print(layer)

[[5, 0], [5, 0], [10, 0], [0, 0]]
[[0, 0], [0, 0], [0, 0], [9, 10]]

第一层是对应于第一个用户的2-D矩阵等

完成所有这些 - 我真的没有任何理由想要使用dataMatrix而不是dataDict