Python与Matlab常用函数对照:文件读写、数组重塑与信号滤波

白榆
白榆
发布时间:2026-10-16| 6人浏览过
原创

本文详细对比Python与Matlab在处理二进制数据时的常用函数差异。涵盖十六进制字节流解析、文件打开与读取(fopen/open, fread/fromfile)、数组维度重塑(reshape)以及信号滤波处理(filter/lfilter)的具体实现代码与参数说明,帮助开发者快速完成两种语言的代码迁移。

1、十六进制字节流数据

存在一个二进制文本文件data,其内容如下所示。

b"\xd0\x01n\x01\xb3\x1b\x07\x05\xee\x06\xcc\xfe\x84\x12\xab\x07~\x08p\x00\x92\x14u\x01\xe4\x12d\xfe9\x08\xb0\x1e\xa6\x02\xb1C?\x18#E\x12\x12\x13^v\x04w\x1d\xe8\x04\x9bf\x1a\x1c\x9b\x0b\xb0\x11\xae%#\x06\xbe\x1f^\x15s.\x92\x10k'`\x0b[ {\x03!\x00 \x1b\xdf(\xec#\xfcH=\x02\x1e\x11!\x07\xba\xedu \xa7\x0e\xdb\x0by\xfb\x91\x05H\x03\xcb\x08\x94\x04\xfd\x13n\xf8\x07\x06d\xfd\xaf\t{\x17\xda$y\x10"

该数据由设备通过TCP协议传输,并经过小端字节序转换后的十六进制字节流。

可通过以下两种方式进行文件转换与查看。

方法一:

import struct

def updack_data(data):
    # 十六进制字节流转十进制
    dec_data = []
    for i in range(0, len(data), 2):
        dec_data.append(struct.unpack("@h", data[i: i + 2])[0])  # 小端
    return dec_data

with open('data', 'rb') as f:
    signal = f.read()
    print(updack_data(signal))

方法二:

import numpy as np
a = b"\xd0\x01n\x01\xb3\x1b\x07\x05\xee\x06\xcc\xfe\x84\x12\xab\x07~\x08p\x00\x92\x14u\x01\xe4\x12d\xfe9\x08\xb0\x1e\xa6\x02\xb1C?\x18#E\x12\x12\x13^v\x04w\x1d\xe8\x04\x9bf\x1a\x1c\x9b\x0b\xb0\x11\xae%#\x06\xbe\x1f^\x15s.\x92\x10k'`\x0b[ {\x03!\x00 \x1b\xdf(\xec#\xfcH=\x02\x1e\x11!\x07\xba\xedu \xa7\x0e\xdb\x0by\xfb\x91\x05H\x03\xcb\x08\x94\x04\xfd\x13n\xf8\x07\x06d\xfd\xaf\t{\x17\xda$y\x10"
print(np.fromstring(a, dtype=np.int16))

运行输出结果:

[464, 366, 7091, 1287, 1774, -308, 4740, 1963, 2174, 112, 5266, 373, 4836, -412, 2105, 7856, 678, 17329, 6207, 17699, 4626, 24083, 1142, 7543, 1256, 26267, 7194, 2971, 4528, 9646, 1571, 8126, 5470, 11891, 4242, 10091, 2912, 8283, 891, 33, 6944, 10463, 9196, 18684, 573, 4382, 1825, -4678, 8309, 3751, 3035, -1159, 1425, 840, 2251, 1172, 5117, -1938, 1543, -668, 2479, 6011, 9434, 4217]

2、fopen与open

用于打开文件资源。

Matlab中打开文件的方式:

fid=fopen('data','rb');

Python中打开文件的方式:

fid = open('data', 'rb')

其中data代表完整的文件路径或文件名。

3、fread与fromfile

用于从文件中读取数据。

Matlab读取文件的代码示例:

signal=fread(fid,data_len,'int16');   %列向量

fread函数用于读取二进制数据,其第二个参数指定输出向量的长度,第三个参数指定读取项的大小或数据类型。

Python读取文件的代码示例:

import numpy as np

signal = np.fromfile(fid, np.int16)  # 转Int16

fid为文件对象句柄,也可以直接传入文件名进行读取:

import numpy as np

signal = np.fromfile('data', np.int16)  # 转Int16

其中data为完整的文件路径或文件名。

4、reshape

reshape函数用于重塑数组形状,例如将一维数组转换为多维数组。

Matlab中的实现方式:

signal1=reshape(signal,2,[]);

该操作将一维的signal数据转换为2行n列的数组结构。

Python中的实现方式:

signal1 = signal.reshape((-1, 2)).T  

参数-1表示自动计算行数,2表示列数,.T表示转置操作,最终得到2行n列的数组。

若需将一维数组转换为10行n列,可参考以下代码:

import numpy as np
phase = np.reshape(signal1[0], (-1, 10)).T

5、filter与lfilter

y = filter(b,a,x) 函数利用由分子系数b和分母系数a定义的有理传递函数,对输入数据x进行滤波处理。

Matlab中的滤波调用:

y=filter(HP,1,phase(1,:));

Python中的滤波调用:

from scipy.signal import lfilter
y = lfilter(b=HP, a=1, x=phase[0], axis=0) # 滤波

以上介绍了Python与Matlab在常用函数互转方面的关键点,更多相关内容可参考本站历史文章或继续浏览后续文章,感谢支持。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。