Python 如何从多个向量构造一个numpy数组,其中数据按id对齐
我正在使用Python、numpy和scikit-learn。我有存储在SQL表中的键和值的数据。我将其作为元组列表检索,返回为: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
[(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”解决方案。