Numpy: ошибка сегментации при сцеплении - PullRequest
0 голосов
/ 20 апреля 2019

С к сожалению устаревшей numpy версией 1.8.2 я получаю следующее поведение:

У меня есть словарь с восемью разреженными матрицами CSR в качестве значений.

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

До этого момента,нет проблем.Список содержит плотные двумерные матрицы с формами (1,len(select),1).len(select) меньше 300. Потребление памяти составляет всего около 3% и доступно почти 7 ГБ свободной оперативной памяти.

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

В мгновение ока я получаю ошибку сегментации (' Speicherzugriffsfehler ') из терминала, на htop не видно развития, что память будет заполнена или что-то еще.Кроме того, я думаю, что потребление не должно превышать примерно вдвое больше, чем раньше, и это практически ничего.Тем не менее, я могу повторять так часто, как хочу, это всегда дает мне SegFault.

Я хотел бы исключить, что это проблема моей реализации.

ОБНОВЛЕНИЕ: Похоже, что после незначительного обновления numpy до версии 1.10 проблема больше не возникает.Может быть, какая-то серьезная ошибка в 1.8.2, о которой никто не заботится, так как она полностью устарела ...

1 Ответ

1 голос
/ 21 апреля 2019

Глядя на ваш код, происходит что-то странное (даже в 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]])

Всего несколько дней назад я увидел вопрос, который произвел 3d np.matrix, когда его не должно было быть.

Почему индексация этой матрицы Numpy вызывает ошибку?

...