Python如何处理数据的参考?

Posted

技术标签:

【中文标题】Python如何处理数据的参考?【英文标题】:Reference for how Python handles data? 【发布时间】:2022-01-22 12:22:09 【问题描述】:

我有一个 列表,它由 的 16 位 PCM 值组成。该列表是直接读取一段 16 位 PCM 波形文件的结果。然后,我从该构建列表中创建一个 numpy 数组,将其保存为单独的波形文件以进行训练,但 wavfile.write() 总是失败,因为 16 位 PCM 数据在某种程度上是错误的,例如:

    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(' 而 pack 产生:hexval 是:b 'z\xfe' 并且是类型:。结果之间存在差异,具体取决于使用哪个。问题可能是由于使用了 pack 和 unpack 以及产生的不同类型。 另外,我注意到当保存在文件中并以 HxD 格式打开时,struct.unpack 使用 xFFFF 或 x0000 填充我的原始数据,具体取决于它是正数还是负数,例如:7A FE FF FF 或 2F 01 00 00。根据 struct 的页面,“h”是“short, integer, 2”,那么为什么要填充呢?包不垫。我想我必须通过源来弄清楚它是如何处理数据的。 你需要跟踪哪个变量有什么形式的数据;在你的笔记本或白板或一张纸或其他东西上做一张桌子 我发现 Python 似乎想要使用 32 位。我使用 hexval = int.from_bytes(hexval, "little", signed="True") 将 16 位值 b'z\xfe' 转换为 int,这会产生 -390 of 实际上是十六进制值 7A FE FF FF。这被 wavfile.write(filename, sr, nparray.astype(np.int16)) 接受,并生成一个 16 位 PCM 文件,Audacity 将其作为波形文件打开。所以,填充看起来很正常,但我一直在阅读库源代码,但还没有找到为什么 Python 不能立即处理 16 位 PCM 值。 【参考方案1】:
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 字节值会产生 并将 numpy 数组值错误地保存在 numpy 数组文件中,作为 4 字节值:7A FE FF FF 打包其两个字节值时会产生 键入并将值正确保存为 2 字节值:7A FE。如何控制 Python 的默认数据类型以强制使用 int16 的 dtype,以便 wavefile.write(参见原始帖子中的 1)使用它?

以上是关于Python如何处理数据的参考?的主要内容,如果未能解决你的问题,请参考以下文章

如何处理Python3.4 使用pymssql 乱码问题

你好,arcgis添加数据显示没有空间参考,也不能设置要如何处理

python正则如何处理NULL?

python如何处理具有相同名称的模块和包?

qgroundcontrolGPS定位失败如何处理

python requests库如何处理302重定向?