【发布时间】:2016-03-10 19:47:46
【问题描述】:
如何使用 numpy 加快数据读取和类型转换?我还面临获取 numpy.void 类型对象的问题,因为据我所知是异构数组,而不是 ndarrays。我创建了一个简单的测试,显示numpy.genfromtxt 比纯python 代码慢,但我相信一定有更好的方法。我无法让numpy.loadtxt 工作。
如何提高性能?以及如何获取 ndarray 子数组作为结果?
import timeit
import numpy as np
line = "QUAD4 1 123456 123456781.2345671.2345671.234567 "
text = [line + "\n" for x in range(1000000)]
with open("testQUADs","w") as f:
f.writelines(text)
setup="""
import numpy as np
"""
st="""
with open("testQUADs", "r") as f:
fn = f.readlines()
for i, line in enumerate(fn):
l = [line[0:8], line[8:16], line[16:24], line[24:32], line[32:40], line[40:48], line[48:56], line[56:64], line[64:72], line[72:80]]
fn[i] = [l[0].strip(), int(l[1]), int(l[2]), int(l[3]), float(l[4]), float(l[5]), float(l[6]), l[7].strip()]
fn = np.array(fn)
"""
stnp="""
array = np.genfromtxt("testQUADs", delimiter=8, dtype="|S8, i4, i4, i4, f8, f8, f8, |S8")
print(array[0])
print(type(array[0]))
"""
print(timeit.timeit(st, setup=setup, number=1))
print(timeit.timeit(stnp, setup=setup, number=1))
输出:
4.560215269000764
(b'QUAD4 ', 1, 123456, 12345678, 1.234567, 1.234567, 1.234567, b' ')
<class 'numpy.void'>
6.360823633000109
【问题讨论】:
-
看过 6 次后,我得到了负面评价,老实说,我不明白为什么。我不相信。我已阅读有关此主题的 numpy 用户手册,我已查看有关此主题的 numpy 参考手册,我已在网上查看,但我的问题没有解决。
-
别介意我会“修复”它,因为其他人可能也会对这个问题感兴趣;)
-
不幸的是,我的 numpy 经验很少,所以请原谅我的无知,但是是否可以使用
numpy.fromfile()读取您的数据 - 文档说 - “一种读取二进制数据的高效方法一个已知的数据类型”...
标签: python numpy genfromtxt