4

我正在玩我正在学习的课程的代码片段,它最初是用 MATLAB 编写的。我使用 Python 并将这些矩阵转换为 Python 用于玩具示例。例如,对于以下 MATLAB 矩阵:

s = [2 3; 4 5];

我用

s = array([[2,3],[4,5]])

以这种方式重新编写所有玩具示例对我来说太耗时了,因为我只想看看它们是如何工作的。有没有办法直接将 MATLAB 矩阵作为字符串提供给 Numpy 数组或更好的替代方法?

例如,类似:

s = myMagicalM2ArrayFunction('[2 3; 4 5]')
4

3 回答 3

6

numpy.matrix可以将字符串作为参数。

Docstring:
matrix(data, dtype=None, copy=True)

[...]

Parameters
----------
data : array_like or string
   If `data` is a string, it is interpreted as a matrix with commas
   or spaces separating columns, and semicolons separating rows.

In [1]: import numpy as np

In [2]: s = '[2 3; 4 5]'    

In [3]: def mag_func(s):
   ...:     return np.array(np.matrix(s.strip('[]')))

In [4]: mag_func(s)
Out[4]: 
array([[2, 3],
       [4, 5]])
于 2013-04-03T13:52:31.097 回答
2

在 Matlab 中保存一组示例矩阵并将它们直接加载到 python 中怎么样:

http://docs.scipy.org/doc/scipy/reference/tutorial/io.html

编辑:

或者不确定这有多健壮(只是将一个简单的解析器放在一起,它可能以其他方式更好地实现),但类似于:

import numpy as np

def myMagicalM2ArrayFunction(s):
    tok = []
    for t in s.strip('[]').split(';'):
        tok.append('[' + ','.join(t.strip().split(' ')) + ']')

    b = eval('[' + ','.join(tok) + ']')
    return np.array(b)

对于一维数组,这将创建一个形状为 (1,N) 的 numpy 数组,因此您可能希望根据您的操作np.squeeze来获取一个 (N,) 形状的数组。

于 2013-04-03T13:22:19.720 回答
0

如果你想要一个 numpy 数组而不是一个 numpy 矩阵

    def str_to_mat(x):
        x = x.strip('[]')
        return np.vstack(list(map(lambda r: np.array(r.split(','), dtype=np.float32), x.split(';'))))
于 2019-05-12T15:50:49.097 回答