首页 > 解决方案 > 将二维列表更改为标准矩阵形式

问题描述

org = [['A', 'a', 1],
       ['A', 'b', 2],
       ['A', 'c', 3],
       ['B', 'a', 4],
       ['B', 'b', 5],
       ['B', 'c', 6],
       ['C', 'a', 7],
       ['C', 'b', 8],
       ['C', 'c', 9]]

我想将“组织”更改为标准矩阵形式,如下所示。

transform = [['\t','A', 'B', 'C'],
             ['a', 1, 4, 7],
             ['b', 2, 5, 8],
             ['c', 3, 6, 9]]

我做了一个小函数来转换它。我写的代码如下:

import numpy as np

def matrix(li):
    column = ['\t']
    row = []
    result = []
    rest = []
    for i in li:
        if i[0] not in column:
            column.append(i[0])

        if i[1] not in row:
            row.append(i[1])


    result.append(column)

    for i in li:
        for r in row:
            if r == i[1]:
                rest.append([i[2]])
    rest = np.array(rest).reshape((len(row),len(column)-1)).tolist()

    for i in range(len(rest)):
        rest[i] = [row[i]]+rest[i]

    result += rest

    for i in result:
        print(i)

matrix(org)

结果是这样的:

>>>['\t', 'school', 'kids', 'really']
[72, 0.008962252017017516, 0.04770759762717251, 0.08993156334317577]
[224, 0.004180594204995023, 0.04450803342634945, 0.04195010047081213]
[385, 0.0021807662921382335, 0.023217182598008267, 0.06564858527712682]

我不认为这是有效的,因为我使用了这么多for循环。有没有有效的方法来做到这一点?

标签: pythonarrayspython-3.xnumpymatrix

解决方案


由于您使用的是 3rd 方库,因此这项任务非常适合pandas.

根据您的要求合并索引和列有一些混乱但并非低效的工作。

org = [['A', 'a', 1],
       ['A', 'b', 2],
       ['A', 'c', 3],
       ['B', 'a', 4],
       ['B', 'b', 5],
       ['B', 'c', 6],
       ['C', 'a', 7],
       ['C', 'b', 8],
       ['C', 'c', 9]]

df = pd.DataFrame(org)

pvt = df.pivot_table(index=0, columns=1, values=2)

cols = ['\t'] + pvt.columns.tolist()

res = pvt.values.T.tolist()
res.insert(0, pvt.index.tolist())
res = [[i]+j for i, j in zip(cols, res)]

print(res)

[['\t', 'A', 'B', 'C'],
 ['a', 1, 4, 7],
 ['b', 2, 5, 8],
 ['c', 3, 6, 9]]

推荐阅读