我在以制表符分隔的值文本文件中有如下数据:
FileName Onsets Offsets
FileName1 [9, 270, 763] [188, 727, 1252]
FileName2 [52, 634, 1166, 1775, 2104] [472, 1034, 1575, 1970, 2457]
FileName3 [180, 560, 1332, 1532] [356, 1286, 1488, 2018]
这些是来自音频文件的数据。每行包含我正在研究的每种声音的一系列开始和偏移时间。
在第一行数据中,9是第一声音的开始时间,188是第一声音的偏移时间。这意味着它持续了179毫秒。
我需要每种声音的持续时间,以及每种声音之间的沉默间隔。
目前,我按如下方式读取数据:
import pandas as pd
import numpy as np
data = pd.read_csv('/path/file.txt', delimiter='\t')
FileName = data[["FileName"]].to_numpy()
Onsets = data[["Onsets"]].to_numpy()
Offsets = data[["Offsets"]].to_numpy()
那给了我三个numpy数组。对于起始和偏移,实际上每一行都是原始数据文件中数字的数组。
我可以使用什么代码来提取这些数字,以便从偏移时间中减去开始时间来确定持续时间?
答案 0 :(得分:2)
ast.literal_eval
'Onsets'
和'Offsets'
中的值转换为numpy.arrays
[9, 270, 763]
和[188, 727, 1252]
之间的第一个沉默间隔始于188
,结束于270
。Offsets
的后两个元素中减去Onsets
的前两个元素
270 - 188
和763 - 727
x[0][1:]
只是Onsets
的第一个元素x[1][:-1]
只是Offsets
的最后一个元素import pandas as pd
import numpy as np
from ast import literal_eval
# load data and use literal_eval to converts strings to lists
data = pd.read_csv('/path/file.txt', delimiter='\t', converters={'Onsets': literal_eval, 'Offsets': literal_eval})
# convert rows of lists to numpy arrays
data[['Onsets', 'Offsets']] = data[['Onsets', 'Offsets']].applymap(np.array)
# subtract the values in the arrays
data['duration'] = data.Offsets.sub(data.Onsets) # data.Offsets - data.Onsets can also be used
# calculate the gaps of silence
data['gaps'] = data[['Onsets', 'Offsets']].apply(lambda x: x[0][1:] - x[1][:-1], axis=1)
# display(data)
FileName Onsets Offsets duration gaps
0 FileName1 [9, 270, 763] [188, 727, 1252] [179, 457, 489] [82, 36]
1 FileName2 [52, 634, 1166, 1775, 2104] [472, 1034, 1575, 1970, 2457] [420, 400, 409, 195, 353] [162, 132, 200, 134]
2 FileName3 [180, 560, 1332, 1532] [356, 1286, 1488, 2018] [176, 726, 156, 486] [204, 46, 44]