首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何利用由id对齐数据的多个向量构造numpy数组

如何利用由id对齐数据的多个向量构造numpy数组
EN

Stack Overflow用户
提问于 2016-07-16 20:30:51
回答 2查看 981关注 0票数 2

我使用的是Pythonnumpyscikit-学习。我有存储在SQL表中的键和值的数据。我把它作为返回为:[(id, value),...]的元组列表来检索。每个id在列表中只出现一次,元组按升序排列。这个过程完成了几次,所以我有多个key: value对列表。使:

代码语言:javascript
复制
dataset = []
for sample in samples:
    listOfTuplePairs = getDataFromSQL(sample)    # get a [(id, value),...] list
    dataset.append(listOfTuplePairs)

键可以在不同的样本中重复,每一行可能有不同的长度。例如,dataset可能是:

代码语言:javascript
复制
dataset = [[(1, 0.13), (2, 2.05)],
           [(2, 0.23), (4, 7.35), (5, 5.60)],
           [(2, 0.61), (3, 4.45)]]

可以看到,每一行都是一个示例,一些ids (在本例中为2)出现在多个示例中。

问题:,我希望构造一个(可能是稀疏的) numpy数组,它适合于使用scikit-learn进行处理。与每个示例的特定键(id)相关的值应在同一“列”中对齐(如果这是正确的术语),以便上面示例的矩阵如下所示:

代码语言:javascript
复制
    ids =     1    2     3      4    5
          ------------------------------
dataset = [(0.13, 2.05, null, null, null),
           (null, 0.23, null, 7.35, 5.60),
           (null, 0.61, 4.45, null, null)]

正如您所看到的,我还希望从矩阵中删除I(尽管我需要保留它们的列表,以便知道矩阵中的值与什么相关)。每个key: value对的初始列表可能包含数千行,并且可能有数千个样本,因此产生的矩阵可能非常大。请提供考虑速度(在Python限制范围内)、内存效率和代码清晰性的答案。

非常,非常感谢您的帮助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-07-16 20:57:53

下面是一种基于NumPy的方法来创建一个具有内存效率的稀疏矩阵coo_matrix -

代码语言:javascript
复制
from scipy.sparse import coo_matrix

# Construct row IDs
lens = np.array([len(item) for item in dataset])
shifts_arr = np.zeros(lens.sum(),dtype=int)
shifts_arr[lens[:-1].cumsum()] = 1
row = shifts_arr.cumsum()

# Extract values from dataset into a NumPy array
arr = np.concatenate(dataset)

# Get the unique column IDs to be used for col-indexing into output array
col = np.unique(arr[:,0],return_inverse=True)[1]

# Determine the output shape
out_shp = (row.max()+1,col.max()+1)

# Finally create a sparse marix with the row,col indices and col-2 of arr
sp_out = coo_matrix((arr[:,1],(row,col)), shape=out_shp)

请注意,如果IDs应该是输出数组中的列号,则可以用如下所示的方式替换为我们提供这样唯一ID的np.unique的用法-

代码语言:javascript
复制
col = (arr[:,0]-1).astype(int)

这应该会给我们一个很好的性能提升!

样本运行-

代码语言:javascript
复制
In [264]: dataset = [[(1, 0.13), (2, 2.05)],
     ...:            [(2, 0.23), (4, 7.35), (5, 5.60)],
     ...:            [(2, 0.61), (3, 4.45)]]

In [265]: sp_out.todense() # Using .todense() to show output
Out[265]: 
matrix([[ 0.13,  2.05,  0.  ,  0.  ,  0.  ],
        [ 0.  ,  0.23,  0.  ,  7.35,  5.6 ],
        [ 0.  ,  0.61,  4.45,  0.  ,  0.  ]])
票数 5
EN

Stack Overflow用户

发布于 2016-07-16 20:51:37

您可以将数据集中的每个元素转换为字典,然后使用熊猫数据框架,它将返回接近预期输出的结果。如果需要2D numpy数组,我们可以使用as_matrix()方法将数据帧转换为numpy数组:

代码语言:javascript
复制
import pandas as pd
pd.DataFrame(dict(x) for x in dataset).as_matrix()

# array([[ 0.13,  2.05,   nan,   nan,   nan],
#        [  nan,  0.23,   nan,  7.35,  5.6 ],
#        [  nan,  0.61,  4.45,   nan,   nan]])
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38415354

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档