您在csv文件中保存了一个非常大的矩阵。您想要转置它并将其保存到另一个文件中。您无法一次将所有数据加载到内存中。你怎么能这样做?
我认为我们可以从文件中读取一行并将其转置到一列并将该列写入文件。读取和转置行到列是可以的,但我不知道如何逐列写入文件。任何人都可以实施?
答案 0 :(得分:0)
无论如何,我会给你一个提示:
ol = or x C + oc (consider arr[or][oc])
它将移动到转置矩阵中的新位置nl,例如nl = A [nr] [nc],或者用C / C ++术语
nl = nr x R + nc
(R - 列数,C是矩阵转置时的行数)
nr = oc和nc =或者,所以将这些替换为nl,
nl = oc x R + or
所以,
ol = or x C + oc
ol x R = or x C x R + oc x R
= or x N + oc x R (from the fact R * C = N)
= or x N + (nl - or) --- from [eq 1]
= or x (N-1) + nl
OR,
nl = ol x R - or x (N-1)
nl和ol的值永远不会超过N-1,所以考虑到两侧的模除法(N-1),我们得到以下基于同余属性的以下内容,
nl mod (N-1) = (ol x R - or x (N-1)) mod (N-1)
= (ol x R) mod (N-1) - or x (N-1) mod(N-1)
= ol x R mod (N-1), since second term evaluates to zero
nl = (ol x R) mod (N-1), since nl is always less than N-1
所以现在你可以一次读取一个元素并将其放在相应的转置矩阵中的正确位置。
答案 1 :(得分:0)
https://github.com/micans/reaper中的程序'transpose'在这里可能会有所帮助。它将矩阵作为单个字符串加载到内存中,然后将转置的结果写入文件而不在内存中创建。因此,内存开销绝对限于磁盘上矩阵的大小(未压缩)。该程序可以读取/写入压缩数据,并且行和单元格分隔符是可自定义的(默认为'\ n'和'\ t')。在60460 x 4671矩阵(压缩大小为125M)上进行的简单测试中,它使用的内存比Python + pandas少20倍,比R少12倍,在两种情况下都快13倍。一个好处是不会发生数据舍入或截断的情况,每个字段都将按字节顺序复制。