我使用的是Python、numpy和scikit-学习。我有存储在SQL表中的键和值的数据。我把它作为返回为:[(id, value),...]的元组列表来检索。每个id在列表中只出现一次,元组按升序排列。这个过程完成了几次,所以我有多个key: value对列表。使:
dataset = []
for sample in samples:
listOfTuplePairs = getDataFromSQL(sample) # get a [(id, value),...] list
dataset.append(listOfTuplePairs)键可以在不同的样本中重复,每一行可能有不同的长度。例如,dataset可能是:
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)相关的值应在同一“列”中对齐(如果这是正确的术语),以便上面示例的矩阵如下所示:
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限制范围内)、内存效率和代码清晰性的答案。
非常,非常感谢您的帮助。
发布于 2016-07-16 20:57:53
下面是一种基于NumPy的方法来创建一个具有内存效率的稀疏矩阵coo_matrix -
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的用法-
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. ]])发布于 2016-07-16 20:51:37
您可以将数据集中的每个元素转换为字典,然后使用熊猫数据框架,它将返回接近预期输出的结果。如果需要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]])https://stackoverflow.com/questions/38415354
复制相似问题