我有一个非常大的数据文件,包含N * 100个实数,其中N非常大。我想按列读取数据。我可以整体阅读,然后逐列操作:
data=np.loadtxt(fname='data.txt')
for i in range(100):
np.sum(data[:,i])
或者我可以逐列阅读,并希望这会节省内存并且速度很快:
for i in range(100):
col=np.loadtxt(fname='data.txt',usecols=(i,))
np.sum(col)
然而,第二种方法似乎并不快。 是因为每次代码读取整个数据并提取所需的列?因此它比第一个慢100倍。 是否有任何方法可以一个接一个地读取一列但速度更快?
如果我只想从文件的最后一行获得100号,读取整个col并获取最后一个元素是不明智的选择,如何实现?
答案 0 :(得分:1)
如果我理解你的问题,你只需要最后一行。这将只读取N
行的最后一行:
data = np.loadtxt(fname='data.txt', skiprows=N-1)
答案 1 :(得分:0)
您要问两件事:如何对所有行求和,以及如何读取最后一行。
data=np.loadtxt(fname='data.txt')
for i in range(100):
np.sum(data[:,i])
data
是一个(N,100)
2d数组。您不需要迭代以在每列中求和
np.sum(data, axis=0)
给你一个(100,)数组,每列一个和。
for i in range(100):
col=np.loadtxt(fname='data.txt',usecols=(i,))
np.sum(col) # just throwing this away??
这样你就读了100次文件。在每个loadtxt
调用中,它必须读取每一行,选择ith
字符串,解释它,并在col
中收集它。它可能更快,IF data
太大以至于机器因内存交换而陷入困境。另外,data
上的数组操作比文件读取要快很多。
正如另一个答案显示loadtxt
允许您指定skiprows
参数。它仍会读取所有行(即f.readline()
个调用),但它不会处理它们并在列表中收集值。
进行一些自己的时间测试。