Есть ли способ вычислить произведение Адамара разреженных матриц COO, используя его структуру? - PullRequest
0 голосов
/ 25 июня 2019

Я пытаюсь вычислить произведение Адамара двух матриц, хранящихся в COO-разреженном формате (в SciPy).Есть лекция , которая читает

быстрые и простые пошаговые операции, непосредственное манипулирование массивом данных (быстрый механизм NumPy)

Я понимаю суммуи разница часть, так как мы можем просто объединить matrix.row, matrix.column и matrix.data.Тем не менее, я полагаю, что на самом деле довольно нетривиально вычислить продукт Адамара / ввода, используя структуру COO (возможно, придется совпасть с координатами и применить "&").

Есть ли способ вычислитьПродукт Адамара более эффективно использует разреженный формат COO или это просто недоразумение?

1 Ответ

0 голосов
/ 26 июня 2019

Метод multiply выполняет поэлементное умножение.

Вот пример, в котором a и b являются разреженными матрицами с форматом COO.(Атрибут .A возвращает обычный числовой массив. Я использую его для отображения значений в разреженных матрицах.)

In [41]: a                                                                                                                            
Out[41]: 
<5x8 sparse matrix of type '<class 'numpy.int64'>'
    with 20 stored elements in COOrdinate format>

In [42]: a.A                                                                                                                          
Out[42]: 
array([[0, 9, 2, 9, 0, 6, 6, 2],
       [2, 0, 0, 0, 1, 0, 8, 0],
       [0, 3, 0, 0, 2, 9, 0, 4],
       [0, 0, 0, 0, 0, 0, 0, 5],
       [0, 0, 7, 1, 0, 0, 7, 7]])

In [43]: b                                                                                                                            
Out[43]: 
<5x8 sparse matrix of type '<class 'numpy.int64'>'
    with 20 stored elements in COOrdinate format>

In [44]: b.A                                                                                                                          
Out[44]: 
array([[0, 0, 0, 7, 9, 0, 5, 0],
       [0, 7, 0, 0, 6, 6, 0, 0],
       [3, 0, 2, 0, 3, 0, 0, 0],
       [5, 0, 0, 3, 0, 0, 7, 0],
       [8, 0, 6, 8, 0, 0, 4, 0]])

Вычисляем поэлементное произведение a и b.Обратите внимание, что c использует формат CSR.

In [45]: c = a.multiply(b)                                                                                                            

In [46]: c                                                                                                                            
Out[46]: 
<5x8 sparse matrix of type '<class 'numpy.int64'>'
    with 7 stored elements in Compressed Sparse Row format>

In [47]: c.A                                                                                                                          
Out[47]: 
array([[ 0,  0,  0, 63,  0,  0, 30,  0],
       [ 0,  0,  0,  0,  6,  0,  0,  0],
       [ 0,  0,  0,  0,  6,  0,  0,  0],
       [ 0,  0,  0,  0,  0,  0,  0,  0],
       [ 0,  0, 42,  8,  0,  0, 28,  0]], dtype=int64)

Проверьте результат, вычисляя поэлементное произведение соответствующих массивов с номерами.

In [48]: a.A * b.A                                                                                                                    
Out[48]: 
array([[ 0,  0,  0, 63,  0,  0, 30,  0],
       [ 0,  0,  0,  0,  6,  0,  0,  0],
       [ 0,  0,  0,  0,  6,  0,  0,  0],
       [ 0,  0,  0,  0,  0,  0,  0,  0],
       [ 0,  0, 42,  8,  0,  0, 28,  0]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...