Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从多个向量构造一个numpy数组,其中数据按id对齐_Python_Numpy_Machine Learning_Scikit Learn - Fatal编程技术网

Python 如何从多个向量构造一个numpy数组,其中数据按id对齐

Python 如何从多个向量构造一个numpy数组,其中数据按id对齐,python,numpy,machine-learning,scikit-learn,Python,Numpy,Machine Learning,Scikit Learn,我正在使用Python、numpy和scikit-learn。我有存储在SQL表中的键和值的数据。我将其作为元组列表检索,返回为:[(id,value),…]。每个id在列表中只出现一次,元组按id升序排列。此过程完成几次,因此我有多个key:value对列表。以便: dataset = [] for sample in samples: listOfTuplePairs = getDataFromSQL(sample) # get a [(id, value),...] list

我正在使用Pythonnumpyscikit-learn。我有存储在SQL表中的键和值的数据。我将其作为元组列表检索,返回为:
[(id,value),…]
。每个id在列表中只出现一次,元组按id升序排列。此过程完成几次,因此我有多个
key:value
对列表。以便:

dataset = []
for sample in samples:
    listOfTuplePairs = getDataFromSQL(sample)    # get a [(id, value),...] list
    dataset.append(listOfTuplePairs)
键可以跨不同的样本进行复制,并且每行的长度可能不同。例如,
数据集
可能是:

dataset = [[(1, 0.13), (2, 2.05)],
           [(2, 0.23), (4, 7.35), (5, 5.60)],
           [(2, 0.61), (3, 4.45)]]
可以看出,每一行都是一个样本,一些ID(在本例中为2)出现在多个样本中

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

    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)]
如您所见,我还希望从矩阵中删除ID(虽然我需要保留它们的列表,这样我就知道矩阵中的值是什么)。每个代码的初始列表“KEX>键:值< /代码>对可能包含几千行,可能有几千个样本,因此得到的矩阵可能非常大。请提供考虑速度的答案(在Python的限制范围内)。,内存效率和代码清晰度


非常感谢您的帮助。

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

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

这里有一个基于NumPy的方法来创建一个稀疏矩阵,重点关注内存效率-

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)
请注意,如果
id
应该是输出数组中的列号,那么您可以使用类似于以下内容的
np.unique
来代替为我们提供此类唯一id的用法-

col = (arr[:,0]-1).astype(int)
这将给我们带来良好的性能提升

样本运行-

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

您可能想看看,它提供了与此类似的带标签的数组结构。非常感谢!但是,这仅在数据集中的每一行长度相等时才有效。如果不是,则
arr.shape[:2]=(3,)
@Paul是的,它的数据集形状是规则的。也许可以在问题中添加一个长度不等的示例?我们将看看解决方案是否可以修改以涵盖这种情况。@divakarYou完全正确,我在问题中没有说清楚。我现在已经修改了。对不起。@Paul不用担心!让我也在解决方案中进行编辑非常感谢,这也正是我想要的,可能是一个更好的解决方案——虽然不是一个“纯粹的numpy”解决方案。