gpt4 book ai didi

python - 使用 numpy 从 csv 加载一定数量的行

转载 作者:行者123 更新时间:2023-11-28 21:14:18 33 4
gpt4 key购买 nike

我有一个很长的文件,我只需要其中的一部分。有新数据传入,因此文件可能会变长。

要从 CSV 加载数据,我使用 numpy.genfromtxt

    np.genfromtxt(filename, usecols={col}, delimiter=",", skip_header=skip_head)

这会在开始时切断文件的某些部分,这已经大大加快了加载数据的过程。但是我不能在最后使用 skip_footer 来切断我想要使用的切片之后的部分。

我想要的是只加载一定数量的行。例如假设我跳过前 100 行,然后加载接下来的 50 行,然后跳过其余行。

编辑:我使用的是 Python 3.4
编辑:示例文件:http://www.file-upload.net/download-10819938/sample.txt.html

最佳答案

您可以使用 itertools 获取切片,使用 itemgetter 获取列:

import  numpy as np
from operator import itemgetter
import csv
with open(filename) as f:
from itertools import islice,imap
r = csv.reader(f)
np.genfromtxt(imap(itemgetter(1),islice(r, start, end+1)))

对于python3,你可以在上面的代码中使用fromiter,你需要指定数据类型:

import numpy as np
from operator import itemgetter
import csv
with open("sample.txt") as f:
from itertools import islice
r = csv.reader(f)
print(np.fromiter(map(itemgetter(0), islice(r, start, end+1)), dtype=float))

与其他答案一样,您也可以将 islice 对象直接传递给 genfromtxt 但对于 python3,您需要以二进制模式打开文件:

with open("sample.txt", "rb") as f:
from itertools import islice
print(np.genfromtxt(islice(f, start, end+1), delimiter=",", usecols=cols))

有趣的是,对于使用 itertools.chain 的多个列,如果所有数据类型都相同,则 reshape 的效率是原来的两倍多:

from itertools import islice,chain
with open("sample.txt") as f:
r = csv.reader(f)
arr =np.fromiter(chain.from_iterable(map(itemgetter(0, 4, 10),
islice(r, 4, 10))), dtype=float).reshape(6, -1)

在你的示例文件中:

In [27]: %%timeit
with open("sample.txt", "rb") as f:
(np.genfromtxt(islice(f, 4, 10), delimiter=",", usecols=(0, 4, 10),dtype=float))
....:

10000 loops, best of 3: 179 µs per loop

In [28]: %%timeit
with open("sample.txt") as f:
r = csv.reader(f) (np.fromiter(chain.from_iterable(map(itemgetter(0, 4, 10), islice(r, 4, 10))), dtype=float).reshape(6, -1))

10000 loops, best of 3: 86 µs per loop

关于python - 使用 numpy 从 csv 加载一定数量的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31833004/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com