Scipy ValueError:新数组的总大小必须保持不变

时间:2015-06-10 05:52:55

标签: python numpy scipy

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

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