【发布时间】:2019-11-29 11:53:43
【问题描述】:
基本上我正在做的是计算一个向量,然后写出结果。现在我正在逐行编写它,然后我必须在 datamash transpose 之后转置,这有点烦人。 如果我可以逐列编写制表符分隔的表格,效率会更高。
如何在 Python 中执行此操作(可以通过 np.savetxt 关闭)?
这是我的以下尝试之一:
In [12]: import numpy as np
In [13]: data = np.random.normal(size=(10,3))
In [14]: data
Out[14]:
array([[-0.50469426, -0.9710173 , 0.43285955],
[ 0.71702597, -0.99998294, -1.00353228],
[ 0.77699465, -0.66542361, -0.04594868],
[-0.71012566, -1.46451086, -0.95308903],
[ 0.47470605, -0.56792278, 0.95818696],
[ 1.20729071, -0.04735589, -0.11576503],
[ 1.03686861, 0.72149358, 0.35908901],
[ 0.09520535, 0.24437775, -0.59554944],
[-0.13346795, 0.29530724, 0.17524018],
[-0.16433609, 0.05261348, -0.57545287]])
In [15]: with open("example.tsv", "w") as f:
...: for row in data:
...: print(*row, sep="\t\n", file=f, end="")
...:
In [16]: %%bash
...: cat example.tsv
...:
...:
-0.5046942610111921
-0.9710173002083825
0.43285954686999120.7170259682395401
-0.9999829435149956
-1.003532284093560.7769946455220355
-0.6654236121150638
-0.04594868270526936-0.7101256559235657
-1.4645108615674511
-0.95308903163753660.4747060486691834
-0.5679227787239494
0.9581869616594761.207290709055818
-0.047355888296561795
-0.115765032633420781.036868614074581
0.7214935810053711
0.35908901158512140.09520535113648704
0.2443777544867152
-0.5955494427027563-0.1334679518044996
0.29530724431573385
0.1752401825058493-0.1643360874489238
0.052613481327433834
-0.5754528683216069
【问题讨论】:
-
您可以(1)使用两个文件:从一个文件中读取已写入列的每一行,添加新列并将其写入另一个文件。然后删除第一个文件并重复。 (2) 写入具有足够可用空间的行,以便稍后用其他列覆盖。
-
先转置numpy行和列,然后保存到.csv文件如何? Python 中的一般 writeline 对象一次读取一行,因此没有干净的方法可以绕过它。或者,为大型数据集使用不同的库,例如 tensorflow 来为您处理这个问题?如果您经常处理 10GB 以上的数据集,Tensorflow 是您的最佳选择。
-
我主要关心的是不必一次将所有内容加载到内存中。我想转置它,因为这样我就可以用 2 个并行文件(它们具有相同的结构)逐行迭代以进行特定分析。如果它们被转置,我只能这样做:/
-
@O.rka 啊哈,你第一次提到使用两个文件。这里更要注意 - 如下所述,在标准 python 中编写 for-iterator 的想法是破坏进程性能。最好的结果将是 python 让 { Heavy | numpy-tools 中的轻 }-计算和迭代(最好智能对齐到 numpy-broadcasts 和矢量化代码表达式)。这样才能获得最佳性能。
标签: python arrays file numpy io