Python—高效地将数据从元组列表提取到另一个列表
被调用的多处理函数生成包含元组(索引i、索引j、某些结果)的原始数据列表。这通常是一个相当大的列表,但下面是一些简短的示例:Python—高效地将数据从元组列表提取到另一个列表,python,numpy,matrix,tuples,Python,Numpy,Matrix,Tuples,被调用的多处理函数生成包含元组(索引i、索引j、某些结果)的原始数据列表。这通常是一个相当大的列表,但下面是一些简短的示例: raw_data = [(0, 0, 1.0), (0, 1, 0.8006688952445984), (0, 2, 0.7255614995956421), (0, 3, 0.7885053157806396), (0, 4, 0.9278563261032104), (0, 5, 0.8481519222259521), (0, 6, 0.5808478593826
raw_data = [(0, 0, 1.0),
(0, 1, 0.8006688952445984),
(0, 2, 0.7255614995956421),
(0, 3, 0.7885053157806396),
(0, 4, 0.9278563261032104),
(0, 5, 0.8481519222259521),
(0, 6, 0.5808478593826294),
(0, 7, 0.7729462385177612),
(0, 8, 0.4846215844154358),
(0, 9, 0.6634186506271362),
(1, 1, 1.0),
(1, 2, 0.9437128305435181),
(1, 3, 0.9655782580375671),
(1, 4, 0.8094803690910339),
(1, 5, 0.7461609840393066),
(1, 6, 0.6327897906303406),
(1, 7, 0.7813301682472229),
(1, 8, 0.5511380434036255),
(1, 9, 0.7230715155601501),
(2, 2, 1.0),
(2, 3, 0.9496157765388489),
(2, 4, 0.6908014416694641),
(2, 5, 0.6450313925743103),
(2, 6, 0.510845422744751),
(2, 7, 0.6914690732955933),
(2, 8, 0.4440484046936035),
(2, 9, 0.6007179617881775),
(3, 3, 1.0),
(3, 4, 0.7783468961715698),
(3, 5, 0.7336279153823853),
(3, 6, 0.6183328032493591),
(3, 7, 0.7425610423088074),
(3, 8, 0.4954148828983307),
(3, 9, 0.6851986646652222),
(4, 4, 1.0000001192092896),
(4, 5, 0.916759729385376),
(4, 6, 0.6729019284248352),
(4, 7, 0.8551595211029053),
(4, 8, 0.4803779423236847),
(4, 9, 0.7606569528579712),
(5, 5, 0.9999998807907104),
(5, 6, 0.7227450013160706),
(5, 7, 0.8301199078559875),
(5, 8, 0.47183749079704285),
(5, 9, 0.7638712525367737),
(6, 6, 1.0),
(6, 7, 0.8355474472045898),
(6, 8, 0.5089120864868164),
(6, 9, 0.8670180439949036),
(7, 7, 1.0000001192092896),
(7, 8, 0.4481610059738159),
(7, 9, 0.9298642873764038),
(8, 8, 0.9999999403953552),
(8, 9, 0.43459969758987427),
(9, 9, 0.9999998807907104)]
现在我需要将原始_数据转换为clean_数据(clean_数据已经初始化),将元组中的前两个值作为clean_列表中元素的索引,将第三个值作为这些元素的值:
for item in raw_data:
clean_data[item[0]][item[1]] = item[2]
这是可行的,但需要花费很多时间。我相信这可以用更有效的方式来完成,可能是使用numpy.take或numpy.choose,但我没有想到如何做到-(不确定这是否更快,但这里有一个使用Numpy的解决方案,它生成一个填充值的二维Numpy数组。它分别基于元组的第一个和第二个元素的最大值来初始化一个填充值为零的数组。在这个解决方案中,一些值保持为0,因为在示例:x和y的每个可能组合都没有一个值。您说您的clean_数据已经初始化,因此您可以更新此代码(或者在必要时要求在注释中进行后续操作)
最后,我决定不使用多处理函数的结果返回索引。因此,除了结果之外,我什么都没有,根据@Nan和@AlexK(谢谢大家!)的想法,我将这些结果放入上三角矩阵,并使用numpy函数创建结果的对称矩阵
clean_data[np.triu_indices(dim)] = raw_data # Upper triangle with diagonale
clean_data += clean_data.T - np.diag(clean_data.diagonal()) # Full matrix
其中dim是clean_数据矩阵的维数。现在我得到的结果非常、非常、非常快。数据是否形成了上下三角剖分(即np.triu、np.tril)的变体?列a、b、c…c=np.array(原始_数据)[:,2]@NaN是的,实际上这些索引构成了整个clean_数据的一个上三角。但这是我的第二个阶段:将这些上三角值,转置并求和(不带对角线)到完整的clean_数据列表中。你有没有想法将这些步骤合并为一个?结果[行,列]=vals;TypeError:列表索引必须是整数,而不是tupleRegardles。由于这个小错误,整个数据集的处理过程需要很长时间,所以很遗憾,这不是我需要的。无论如何,谢谢!我的代码中没有错误,因为“result”不是我的代码中的列表。如果需要,我的代码会在流程结束时将其转换为列表,如代码中最后一条注释所示。
clean_data[np.triu_indices(dim)] = raw_data # Upper triangle with diagonale
clean_data += clean_data.T - np.diag(clean_data.diagonal()) # Full matrix