首页 > 解决方案 > Numpy:连接时出现分段错误

问题描述

不幸的是,过时的 numpy 版本1.8.2,我得到以下行为:

我有一本包含八个稀疏 CSR 矩阵作为值的字典。

>>> tmp = [ (D[key][select,:].T.sum(0))[:,:,None] for key in D ];

到此为止,没有问题。该列表包含具有形状的密集 2d numpy 矩阵(1,len(select),1)len(select)小于 300。内存消耗仅为 3% 左右,几乎 7 GB 可用 RAM 。

>>> result = np.concatenate(tmp,axis=2);

眨眼之间,我从终端收到了 Segmentation Fault (' Speicherzugriffsfehlerhtop '),没有可见的内存将运行满或任何情况。另外,我认为消耗量不应超过以前的大约两倍,这实际上不算什么。尽管如此,我可以随心所欲地重复,它总是给我一个 SegFault。

我想排除这是我的实施问题。

更新:似乎将 numpy 稍微更新到 1.10 版后,问题不再发生。也许 1.8.2 中有一些严重的错误,没有人关心,因为它已经完全过时了......

标签: pythonnumpymatrixsegmentation-faultconcatenation

解决方案


查看您的代码,发生了一些奇怪的事情(即使在 1.16 中)

从样本稀疏矩阵开始:

In [365]: M                                                                          
Out[365]: 
<10x10 sparse matrix of type '<class 'numpy.float64'>'
    with 20 stored elements in Compressed Sparse Row format>
In [366]: M[0,:].T                                                                   
Out[366]: 
<10x1 sparse matrix of type '<class 'numpy.float64'>'
    with 3 stored elements in Compressed Sparse Column format>
In [367]: M[0,:].T.sum(0)       

稀疏矩阵的行或列总和产生np.matrix.

Out[367]: matrix([[1.91771869]])
In [368]: M[0,:].T.sum(0)[:,:,None]                                              
Out[368]: matrix([[[1.91771869]]])

我们不应该将 a 扩展np.matrix到 3d。这会导致连接问题吗?不是现在,但它可能在早期版本中

In [369]: np.concatenate([M[0,:].T.sum(0)[:,:,None]])   
Out[369]: matrix([[1.91771869]])
In [370]: _368.shape                                                                 
Out[370]: (1, 1, 1)  
In [371]: np.concatenate([_368,_368])                                                
Out[371]: matrix([[1.91771869, 1.91771869]])

就在几天前,我看到了一个产生 3d 的问题np.matrix,而它不应该产生。

为什么索引这个 Numpy 矩阵会导致错误?


推荐阅读