【问题标题】:Scipy ValueError: Total size of new array must be unchangedScipy ValueError:新数组的总大小必须保持不变
【发布时间】:2015-06-10 17:07:29
【问题描述】:

我目前正在使用 Scipy 0.7.2 和 Numpy 1.4.1。我的 Python 版本是 2.6.6。我编写了一个简单的代码来从 .mtx 文件中读取 coo 稀疏矩阵,如下所示:

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

【问题讨论】:

  • 你有比那一行更多的回溯吗?
  • @Evert 我现在已经在问题中包含了整个回溯。现在问题更清楚了吗?
  • 那(希望)有帮助,是的;看我的回答。完整的回溯(或至少最后和前 10-20 行)几乎总是更有帮助。
  • 我很惊讶您仍在使用 Python 2.6 / numpy 1.4 和 scipy 0.7。这是一些需要稳定且不允许更新的旧机器吗?因为在某些时候,这可能会阻止您为(可能)科学工作安装其他软件包。
  • 大声笑。你太棒了!是的,这是一台受限制的旧机器,我个人无法对其进行任何升级:)

标签: python numpy scipy


【解决方案1】:

回溯的最后几行表明可能的问题:数据文件被读取为平面 (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

【讨论】:

  • 您似乎已正确识别出问题所在。那么如何删除“格式错误”的数据。我实际上是首先自己创建矩阵。关于如何写入数据以使错误不会出现的任何提示?
  • @sgp 查看更新,了解一种消除不良方式的方法。但是,显然,您应该尝试在创建它们的地方修复错误。这可能是另一个问题。
猜你喜欢
  • 1970-01-01
  • 2019-12-16
  • 2020-11-18
  • 1970-01-01
  • 2016-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多