Python如何处理数据的参考?
Posted
技术标签:
【中文标题】Python如何处理数据的参考?【英文标题】:Reference for how Python handles data? 【发布时间】:2022-01-22 12:22:09 【问题描述】:我有一个
wavfile.write(savepath + 'wave_speechsegment_' + str(wavecnt) + '.wav', sr, nparray.astype(np.int16))
生成 ValueError: invalid literal for int() with base 10: b'z\xfe'
错误
直接尝试 nparray:wavfile.write(savepath + 'wave_speechsegment_' + str(wavecnt) + '.wav', sr, nparray)
我得到 ValueError: Unsupported data type '|S2
我尝试将列表设置为 16 位 PCM 值:
hexval = struct.pack('<BB', val[0], val[1])
waveform.append(hexval)
nparray = np.array(waveform)
但是当我将 16 位 PCM 值保存到 numpy 文件时,python 报告:
nparray is type: <class 'numpy.ndarray'> and nparray[0] is: b'z\xfe' and is type: <class 'numpy.bytes_'>
将 numpy 数组段保存到文件中会精确生成在源波形文件中为该段找到的数据集,例如:
7A FE DE FE C5 FF 75 00 2F 01 76 01 99 01 55 01 05 01 74 00 05 00 9D FF 79 FF 65 FF 8C FF C9 FF
谁能告诉我有关 python 如何处理数据的信息,以便我可以将 16 位 PCM 数据保留为 16 位 PCM 数据?
【问题讨论】:
我想你在将数据传送到 numpy 数组时需要struct.unpack
?
使用 hexval = struct.unpack('In [73]: astr = b'z\xfe'
In [74]: type(astr)
Out[74]: bytes
In [75]: len(astr)
Out[75]: 2 # 2 bytes
这不是list
。它是一个字符串,更具体地说是一个字节字符串,而不是默认的(对于 Python 3)unicode 字符串。
从字符串等创建的数组将具有S
dtype:
In [76]: arr= np.array(astr)
In [77]: arr
Out[77]: array(b'z\xfe', dtype='|S2')
In [78]: arr= np.array(astr+astr+astr) # + joins strings into one
In [79]: arr
Out[79]: array(b'z\xfez\xfez\xfe', dtype='|S6')
数组的data-buffer
包含这些字节。并且可以view
作为其他兼容的dtypes。
In [87]: arr= np.array([astr+astr+astr])
In [88]: arr
Out[88]: array([b'z\xfez\xfez\xfe'], dtype='|S6')
In [89]: arr.view('S1')
Out[89]: array([b'z', b'\xfe', b'z', b'\xfe', b'z', b'\xfe'], dtype='|S1')
In [94]: arr.view('int16')
Out[94]: array([-390, -390, -390], dtype=int16)
In [95]: arr.view('uint16')
Out[95]: array([65146, 65146, 65146], dtype=uint16)
In [98]: arr.view('>i2')
Out[98]: array([31486, 31486, 31486], dtype=int16)
【讨论】:
PEP 358 声明“字节对象存储范围为 0 到 255 的可变整数序列。与字符串对象不同,对字节对象进行索引会返回一个整数。”解压刚刚读取的 2 字节值会产生以上是关于Python如何处理数据的参考?的主要内容,如果未能解决你的问题,请参考以下文章