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