gpt4 book ai didi

python - 使用 numpy.loadtxt 解析包含 HH :MM:SS. mmm 次的数据矩阵

转载 作者:太空宇宙 更新时间:2023-11-04 10:35:35 25 4
gpt4 key购买 nike

我知道我可以做类似的事情

numpy.loadtxt('data.txt', dtype={'names': ('time', 'magnitude'),
'formats': ('S12', 'f8')})

但这给了我时间作为一个字符串。我怎样才能把它操纵成一个 float ?

最佳答案

您可以使用 converter parameter将函数应用于第一列中的每个字符串。为每一行调用一次 Python 函数可能会大大降低 np.loadtxt 的速度,但这对于中等大小的文件来说仍然是一个可行的解决方案:

import numpy as np

def parse_date(datestr):
return sum([multiplier*val for multiplier, val in
zip((3600, 60, 1), map(float, datestr.split(':')))])


x = np.loadtxt('data', dtype={'names': ('time', 'magnitude'), 'formats': ('f8', 'f8')},
converters={0:parse_date})
print(x)

或者,您可以在使用 loadtxt 后将字符串解析为 float ,如下所示:

x = np.loadtxt('data', dtype={'names': ('time', 'magnitude'), 'formats': ('S12', 'f8')})
arr = np.char.split(x['time'], ':')
# http://stackoverflow.com/a/19459439/190597 (Jaime)
newarr = np.fromiter((tuple(row) for row in arr), dtype=[('', np.float)]*3,
count=len(arr)).view('float').reshape(-1, 3)
times = (newarr * [3600,60,1]).sum(axis=1)

y = np.empty_like(x, dtype={'names': ('time', 'magnitude'), 'formats': ('f8', 'f8')})
y['time'] = times
y['magnitude'] = x['magnitude']
print(y)

编辑:我创建了一个 10**6 行的测试文件来测试哪种方法更快。第二种方法快一点:

In [329]: %timeit using_fromiter()
1 loops, best of 3: 5.59 s per loop


In [328]: %timeit using_converter()
1 loops, best of 3: 6.88 s per loop

import os
import numpy as np

def create_data(N):
data = np.random.random(size=N)*86400
hours, remainder = data.__divmod__(3600)
minutes, seconds = remainder.__divmod__(60)
mag = np.arange(N)
filename = os.path.expanduser('~/tmp/data')
with open(filename, 'w') as f:
for h,m,s,a in np.column_stack([hours, minutes, seconds, mag]):
f.write('{h:d}:{m:d}:{s:.6f} {a}\n'.format(h=int(h), m=int(m), s=s, a=a))

def parse_date(datestr):
return sum([multiplier*val for multiplier, val in
zip((3600, 60, 1), map(float, datestr.split(':')))])

def using_converter():
x = np.loadtxt('data', dtype={'names': ('time', 'magnitude'),
'formats': ('f8', 'f8')},
converters={0:parse_date})
return x

def using_fromiter():
x = np.loadtxt('data', dtype={'names': ('time', 'magnitude'), 'formats': ('S12', 'f8')})
arr = np.char.split(x['time'], ':')
newarr = np.fromiter((tuple(row) for row in arr), dtype=[('', np.float)]*3,
count=len(arr)).view('float').reshape(-1, 3)
times = (newarr * [3600,60,1]).sum(axis=1)

y = np.empty_like(x, dtype={'names': ('time', 'magnitude'), 'formats': ('f8', 'f8')})
y['time'] = times
y['magnitude'] = x['magnitude']
return y

create_data(10**6)

关于python - 使用 numpy.loadtxt 解析包含 HH :MM:SS. mmm 次的数据矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23482308/

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