我目前正在使用Scipy 0.7.2和Numpy 1.4.1。我的Python版本是2.6.6。我编写了一个简单的代码来从.mtx
文件中读取一个CU稀疏矩阵,如下所示:
data = scipy.io.mmread('matrix.mtx')
运行代码时,出现以下错误:
Traceback (most recent call last):
File "read_mat.py", line 31, in <>
data = scipy.io.mmread('matrix.mtx')
File "/usr/lib64/python2.6/site-packages/scipy/io/mmio.py", line 52, in mmread
return MMFile().read(source)
File "/usr/lib64/python2.6/site-packages/scipy/io/mmio.py", line 273, in read
return self._parse_body(stream)
File "/usr/lib64/python2.6/site-packages/scipy/io/mmio.py", line 417, in _parse_body
flat_data = flat_data.reshape(-1,3)
ValueError: total size of new array must be unchanged
我检查了一些关于SO的问题并发现它可能是某些特定于版本的问题,但是,根据this,它已在我的版本中得到修复。谁能告诉我我能在这做什么?提前谢谢!
编辑:我尝试打开另一个文件,然后阅读了。所以,我想这个问题与我的文件有关。我正在粘贴以下两个文件的前几行:
打开的文件:
%%MatrixMarket matrix coordinate integer general
%
1466983 1466983 655955608
1 1 3448
1 2 824
1 3 1492
1 4 132
1 5 426
无法打开的文件:
%%MatrixMarket matrix coordinate integer general
%
11162 11162 233925
1 2 1
1 3 1
1 4 1
1 16 1
1 19 1
答案 0 :(得分:3)
回溯的最后几行表明可能存在的问题:数据文件被读取为平面(1D)数组,然后scipy尝试将数组重新整形为(n,3)数组,该数组失败。这意味着平面数组的大小不是三的倍数(如果你试图重塑np.ones(4).reshape(-1, 3)
,你会得到同样的错误。)
扁平数组不是三个数组的事实意味着在一行的某个地方,缺少一个数字。那个,或者一行(或多行)在某种程度上是畸形的。它可能只是截止的最后一行,很容易检查。
如果您使用的是* nix,则可以使用awk
来检查:
awk '{ print NF }' matrix.mtx | grep -v 3
应该显示没有由空格分隔的3列的行。
您也可以使用awk删除坏行:
awk '(NF == 3 || NR < 3) { print $0 }' matrix.mtx > goodmatrix.mtx