Am1*_*3zA 5 python arrays numpy
我有一个巨大的文件(大约30GB),每行包括2D曲面上一个点的协调。我需要将文件加载到Numpy array:中points = np.empty((0, 2))
,并对其进行应用scipy.spatial.ConvexHull
。由于文件的大小很大,因此无法立即将其加载到内存中,因此我想将其作为一批N行scipy.spatial.ConvexHull
加载,然后应用到一小部分,然后再加载下N行!什么是有效的方法?
我发现在python中,您可以islice
用来读取文件的N行,但问题是lines_gen
生成器对象,它为您提供了文件的每一行,应该在循环中使用,因此我不确定如何转换所述lines_gen
成numpy的阵列中的一个有效的方法是什么?
from itertools import islice
with open(input, 'r') as infile:
lines_gen = islice(infile, N)
Run Code Online (Sandbox Code Playgroud)
我的输入文件:
0.989703 1
0 0
0.0102975 0
0.0102975 0
1 1
0.989703 1
1 1
0 0
0.0102975 0
0.989703 1
0.979405 1
0 0
0.020595 0
0.020595 0
1 1
0.979405 1
1 1
0 0
0.020595 0
0.979405 1
0.969108 1
...
...
...
0 0
0.0308924 0
0.0308924 0
1 1
0.969108 1
1 1
0 0
0.0308924 0
0.969108 1
0.95881 1
0 0
Run Code Online (Sandbox Code Playgroud)
您可以尝试本文中的第二种方法,并通过使用预先计算的行偏移数组(如果适合内存)引用给定行来读取文件。这是我通常用来避免将整个文件加载到内存中的示例:
data_file = open("data_file.txt", "rb")
line_offset = []
offset = 0
while 1:
lines = data_file.readlines(100000)
if not lines:
break
for line in lines:
line_offset.append(offset)
offset += len(line)
# reading a line
line_to_read = 1
line = ''
data_file.seek(line_offset[line_to_read])
line = data_file.readline()
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
6661 次 |
最近记录: |