【问题标题】:How to create a 2d numpy array from a list of tuples如何从元组列表中创建 2d numpy 数组
【发布时间】:2015-08-30 16:27:22
【问题描述】:

我有一个大文本文件,每行包含三个元素——用户、问题、价值。我想从这些数据中创建一个 2d numpy 数组。数据样本是这样的:

114250 3 1
124400 7 4
111304 1 1

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

我设法使用此代码将数据读入三元组列表(将任意用户 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 数组。我很想知道如何以 Python 的方式做到这一点。

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

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

表示我想将值 1 放入二维矩阵第 10 行第 3 列。

【问题讨论】:

  • 你要存储3个值,你想要numpy数组的结构如何
  • @ZdaR 我想将每个元组的前两个值用作索引(列和行),并将元组中的第三个值放在索引位置。元组中的值是整数。

标签: python


【解决方案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] 

【讨论】:

    【解决方案2】:
    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 开始。

    【讨论】:

      猜你喜欢
      • 2022-09-23
      • 1970-01-01
      • 1970-01-01
      • 2018-01-15
      • 2017-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-07
      相关资源
      最近更新 更多