Python中Matlab的“fscanf”的等价物是什么?

hjqgdpho  于 2023-02-05  发布在  Matlab
关注(0)|答案(5)|浏览(162)

Matlab函数fscanf()看起来很强大,python(或numpy)中有没有同样的等价物?
具体来说,我想从文件中读取一个矩阵,但我不想遍历每一行来读取矩阵。类似这样的例子(从matlab阅读一个2D 1000x1000矩阵):

matrix = fscanf(fopen('input.txt'),'%d',[1000,1000]);
oug3syen

oug3syen1#

Python没有内置的fscanf函数,最接近的方法是逐行读取文件并使用正则表达式。
但是,Numpy(类似于Matlab的Python库)有一个函数,允许读取文件并根据其内容构造数组:numpy.fromfile(或者,如其他答复所建议,numpy.loadtxt可能更适合这种情况)。

nbysray5

nbysray52#

我很确定没有,但是迭代并不难,可以这样做:

matrix = []
for i in open('input.txt'):
    matrix.append( map(int, i.split()) )

如果你需要更复杂的东西(例如,不仅仅是用单个字符分隔的整数),正则表达式可能是一种选择。

tf7tbtn2

tf7tbtn23#

我认为伍凯的答案是不正确的。我认为numpy.loadtxt是你要找的。

yr9zkbsy

yr9zkbsy4#

你看过那比吗?-http://www.scipy.org/Download
顺便说一下,fscanf内部按列顺序存储数据-所以我不认为会有任何效率增益。http://www.mathworks.com/help/techdoc/ref/fscanf.html

bq9c1y66

bq9c1y665#

我认为Python的方法是打开文件并使用列表解析将数据读入listlist
(为了清楚起见,我使用字符串中的数据,并使用StringIO像从文件中一样阅读它。)

>>> from cStringIO import StringIO
>>> data_file="1 2 3 4 5 6\n7 8 9 10 11 12\n13 14 15 16 17 18\n19 20 21 22 23 24\n"
>>> reader=StringIO(data_file)
>>> array=[map(int, reader.readline().split()) for i in xrange(4)]
>>> array
[[1, 2, 3, 4, 5, 6], [7, 8, 9, 10, 11, 12], [13, 14, 15, 16, 17, 18], [19, 20, 21, 22, 23, 24]]

正如前面的回答提到的,numpy有一个更直接的方法。

相关问题