我正在使用matlab python引擎从python中的matlab项目访问数据.这很好用,但是我在高效使用python中的matlab数组方面确实存在问题.例如,我要使用matlab的数组,我用了(eng代表matlab引擎):

x = eng.eval(arg)

我得到的是一个matlab.double数组,看起来像这样:

matlab.double([[1.0,2.0],[4.0,3.0],[2.0,5.0]])

看起来还不错.让我们尝试捕获一个条目:

>>> 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引擎.

解决方法:

我现在正在有效率地使用一种更通用的方法,该方法也允许我根据需要舍入值(但是请注意,舍入会花费更多的计算时间):

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)

标签:performance,multidimensional-array,arrays,matlab,python

来源: https://codeday.me/bug/20191120/2043551.html

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐