matlab数组转集合,将matlab.double数组转换为python数组

我正在使用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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值