转换matlab.double数组到python数组

2024-04-19 23:40:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用matlabpython引擎访问python中的matlab项目中的数据。这很好地工作,但是在python中有效地使用matlab数组确实有一个问题。例如,我想要一个来自matlab的数组,我使用(eng代表matlab引擎):

x = eng.eval(arg)

我得到的是matlab.double数组如下所示:

^{pr2}$

看起来还不错。让我们试着抓住一个条目:

>>> x[2][1]
5.0

耶!一整排怎么样?在

>>> x[0]
matlab.double([1.0,2.0])

。。好吧,至少是吵架了,但我没找到“matlab.double“”前缀。。专栏怎么样?在

>>> x[:][0]
matlab.double([1.0,2.0])

等等,什么?我尝试选择所有行,然后从每个行中选择第一个元素,但是我只得到行。事实上:

x[i] == x[:][i] == x[i][:]

所以,基本上有两个问题出现了:选一排给我带来了不想要的。”matlab.double“前缀和选择一个列(个人更重要)根本不起作用。有什么建议吗? 我现在所做的是重新读取每个值,并将其保存到一个新的python数组中:

c = [[] for _ in range(len(x[0]))]
for i in range(len(x[0])):
    for j in range(len(x)):
        c[i].append(x[j][i])

这是可行的,但有一个问题:随着数据的增长,代码的速度会大大减慢。当然,如果每个条目实际上已经存储在x中,那么重读它们并不是一件美妙的事

感谢您阅读了这篇长文本,我只是假设我解释了一点,因为可能只有少数人使用python matlab引擎。在


Tags: 数据项目in引擎forleneval条目
2条回答

通过以下讨论,我设法找到了一个合理的方法:

c = []
for _ in range(x.size[1]):
    c.append(x._data[_*x.size[0]:_*x.size[0]+x.size[0]].tolist())
return c

这样,该命令需要大约0.009s,而不是之前的0.045s。使用zip函数大约是0.022s。非常感谢,现在代码运行速度快了5倍!在

为了澄清:x.size[i]给出了matlab.double数组的大小。x._data给出一个一维数组类型:

^{pr2}$

因此,它包含一个tolist()方法来获得一个实际的列表,这是我需要的。在

我现在正在高效地使用一种更通用的方法,它还允许我在需要时对值进行四舍五入(但是要小心,舍入需要更多的计算时间):

from math import log10, floor

def convert(self, x, ROUND=0):

    conv = []

    for _ in range(x.size[0]):
        lst = x._data[_::x.size[0]].tolist()

        if ROUND is not 0:
            lst = [self.round_sig(elem, ROUND) if elem != 0 and
                   elem == elem else elem for elem in lst]

        conv.append(lst)

    return conv

def round_sig(self, x, sig=2):
    return round(x, sig-int(floor(log10(abs(x))))-1)

相关问题 更多 >