numpy每次迭代都会读取整个数据吗?

时间:2015-11-15 13:49:50

标签: python python-2.7 numpy

我有一个非常大的数据文件,包含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并获取最后一个元素是不明智的选择,如何实现?

2 个答案:

答案 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()个调用),但它不会处理它们并在列表中收集值。

进行一些自己的时间测试。