如何从元组列表创建一个2d numpy数组

时间:2015-08-30 07:48:19

标签: python

我有一个大文本文件,每行有三个元素 - 用户,问题,值。我想从这些数据创建一个2d numpy数组。数据样本如下:

114250 3 1
124400 7 4
111304 1 1

不幸的是,我事先并不知道结果矩阵的大小,因此无法对其进行初始化。

我设法使用此代码将数据读入3元组列表(将任意用户ID转换为线性1,2,3 ...表示):

users = dict()
data = list()

for line in fileinput.input( args[0] ):
    tokens = line.split("\t")
    tokens = [ t.strip("\r").strip("\n") for t in tokens ]
    user = tokens[0]
    question = tokens[1]
    response = tokens[2]

    if user in users.keys():
        user_id = users.get( user )     # existing user
    else:
        user_counter = user_counter + 1 # add new user
        users[user] = user_counter
        user_id = user_counter

    data.append( (int(user_id), int(question), int(response)) )

我不知道如何将这个元组列表转换为2D numpy数组。我很想知道如何用pythonic方式做到这一点。

应该有一些方法可以读取每个元组,将user_id和问题作为列,行并将响应值放在2D numpy数组中。例如像

这样的元组
(10,3,1)

表示我想将值1放入2D矩阵第10列第3列。

2 个答案:

答案 0 :(得分:1)

import numpy

data = []
with open('filename', 'r') as f:
    for line in f:
        data.append(map(int, line.strip().split()))

r, c = max(data, key=lambda x: x[0]), max(data, key=lambda x: x[1])
A = numpy.zeros(shape = (r+1, c+1))
for i,j, val in data:
    A[i][j] = val

我还没试过这个,但是应该可以。请注意,索引从0开始。

答案 1 :(得分:1)

之后简单生成矩阵:

import numpy as np

data = numpy.array(data)
result = numpy.zeros(shape=(data[:,0].max()+1, data[:,1].max()+1), dtype=int)
result[data[:,0], data[:,1]] = data[:,2]