将二维列表更改为标准矩阵形式

时间:2018-05-09 15:26:34

标签: python arrays python-3.x numpy matrix

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]]

我想将'org'更改为标准矩阵形式,如下所示。

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循环。 有没有有效的方法来做到这一点?

2 个答案:

答案 0 :(得分:1)

由于您使用的是第三方库,因此这项任务非常适合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]]

答案 1 :(得分:1)

这是另一种仅使用numpy的“手动”方式:

org_arr = np.array(org)
key1 = np.unique(org_arr[:,0])
key2 = np.unique(org_arr[:,1])
values = org_arr[:,2].reshape((len(key1),len(key2))).transpose()

np.block([
    ["\t",         key1  ],
    [key2[:,None], values]
])

""" # alternatively, for numpy < 1.13.0
np.vstack((
    np.hstack(("\t", key1)),
    np.hstack((key2[:, None], values))
))
"""

为简单起见,它要求输入矩阵严格排序(第一个col是主要的和升序的......)。

输出:

Out[58]: 
array([['\t', 'A', 'B', 'C'],
       ['a', '1', '4', '7'],
       ['b', '2', '5', '8'],
       ['c', '3', '6', '9']], 
      dtype='<U1')