不幸的是,使用过时的numpy版本1.8.2
,我得到以下行为:
我有一本字典,其中包含八个稀疏的CSR矩阵作为值。
>>> tmp = [ (D[key][select,:].T.sum(0))[:,:,None] for key in D ];
到目前为止,没有问题。该列表包含形状(1,len(select),1)
的密集 2d numpy 矩阵。len(select)
小于 300。内存消耗仅为 3% 左右,几乎 7 GB 可用 RAM。
>>> result = np.concatenate(tmp,axis=2);
在眨眼之间,我从终端得到了分段错误(">Speicherzugriffsfehler"),htop
内存将满运行或任何东西都没有可见的发展。另外,我认为消费量不应该超过以前的两倍,这几乎不算什么。尽管如此,我可以随心所欲地重复,它总是给我一个SegFault。
我想排除这是我的实施问题。
更新:似乎在将numpy稍微更新到1.10版后,问题不再发生。也许 1.8.2 中的一些严重错误没有人关心,因为它完全过时了......
看看你的代码,有一些奇怪的事情发生(即使在 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]]])
我们不应该能够将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]])
就在几天前,我看到一个问题,它产生了一个 3dnp.matrix
,而它不应该有。
为什么索引此 Numpy 矩阵会导致错误?