使用NumPy从文件中读取非均匀数据到数组中

14

假设我有一个如下的文本文件:

33 3
46 12
23 10 23 11 23 12 23 13 23 14 23 15 23 16 24 10 24 11 24 12 24 13 24 14 24 15 24 16 25 14 25 15 25 16 26 16 27 16 28 16 29 16
33 17 33 18 33 19 34 17 34 18 34 19 35 17 35 18 35 19 36 19
41 32 41 33 42 32 42 33

我想把每行读入到不同的整数数组中,例如(伪代码):

for line in textfile:  
    currentArray = firstLine  
    do stuff with currentArray

第一次迭代中,currentArray将会是

array([33, 3])

第二次迭代中,currentArray将会是

array([46, 12])

最后一次迭代结束时,currentArray将会是

array([41, 32, 41, 33, 42, 32, 42, 33])

基本上,我想要具有numpy函数loadtxt的功能:

currentArray = loadtxt('scienceVertices.txt', usecols=() )

但是除了使用usecols之外,还能够指定行,例如

currentArray = loadtxt('scienceVertices.txt', userows=(line) )


根据您的数据文件大小,一次性将所有行加载到内存中可能会显着降低效率。这是可能的,因为在Python中迭代file对象将逐行提供给您,使用IO缓冲区从磁盘顺序加载。另一方面,如果您只有几兆字节的数据,则可能不必费心。 - Katriel
@katrielalex 在我的应用程序中,我可能只会读取几千字节的数据,但是如果我转向更大的文件,我会记住你的建议。谢谢。 - lookitsmarc
4个回答

17

以下是一行代码:

arrays = [np.array(map(int, line.split())) for line in open('scienceVertices.txt')]

arrays 是一个 numpy 数组列表。


干得好。我没有要求将其放入numpy数组列表中,但我认为对于我的应用程序来说这样更好。谢谢。 - lookitsmarc
这个解决方案,至少在Python3中,返回一个映射列表。我该如何使用类似的方法来检索NumPy数组? - heracho
@heracho 只需将 map(...) 函数包装在 list() 函数中即可。 - Paul

6
for line in textfile:
  a = np.array([int(v) for v in line.strip().split(" ")])
  # Work on your array

3

您还可以使用numpy.fromstring()函数

for line in f:
    a = numpy.fromstring(line.strip(), dtype=int, sep=" ")

或者 -- 如果你想要完全的灵活性 -- 甚至可以使用 numpy.loadtxt()

for line in f:
    a = numpy.loadtxt(StringIO.StringIO(line), dtype=int)

长行情况下,这些解决方案比其他答案中的Python代码表现更好。

2
f = open("file", "r")
array = []
line = f.readline()
index = 0
while line:
    line = line.strip("\n")
    line = line.split()
    array.append([])
    for item in line:
        array[index].append(int(item))
    line = f.readline()
    index += 1
f.close()

print array

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接