scipy sparse: получить значения, присутствующие в обеих матрицах - PullRequest
0 голосов
/ 01 мая 2018

У меня есть две sparse матрицы, которые я хочу сравнить поэлементно:

from scipy import sparse as sp
t1 = sp.random(10, 10, 0.5)
t2 = sp.random(10, 10, 0.5)

В частности, я хотел бы создать диаграмму рассеяния для этих элементов, присутствующих (то есть, ненулевых) в обеих матрицах, но пока единственный способ, которым я мог придумать, - преобразовать их в плотный формат:

import matplotlib.pyplot as plt
plt.plot(t1.todense().flatten(),
         t2.todense().flatten(),
         'ko',
         alpha=0.1)

Что работает ужасно, когда матрицы очень большие. Есть ли более эффективный способ сделать это?

enter image description here

1 Ответ

0 голосов
/ 02 мая 2018
In [256]: t1
Out[256]: 
<10x10 sparse matrix of type '<class 'numpy.float64'>'
    with 50 stored elements in COOrdinate format>
In [257]: t2
Out[257]: 
<10x10 sparse matrix of type '<class 'numpy.float64'>'
    with 50 stored elements in COOrdinate format>

При построении графика t1.todense().flatten() вы строите точки данных для всех элементов t1, будь то ноль или нет. В этом случае 100 баллов.

Один из способов «отсеять» нулевые элементы:

In [258]: t3 = t1.multiply(t2)
In [259]: t3
Out[259]: 
<10x10 sparse matrix of type '<class 'numpy.float64'>'
    with 28 stored elements in Compressed Sparse Row format>
In [260]: t11 = t3.astype(bool).multiply(t1)
In [261]: t21 = t3.astype(bool).multiply(t2)
In [262]: t11
Out[262]: 
<10x10 sparse matrix of type '<class 'numpy.float64'>'
    with 28 stored elements in Compressed Sparse Row format>

t3 имеет ненулевые значения, где t1 и t2 отличны от нуля. t11 имеет соответствующие элементы t1 (t3 float становится булевым True и неявно 1 в умножении.) Разреженный multiply относительно эффективен (может быть не так много, как соответствующее плотное умножение или даже разреженная матрица умножать).

Мы могли бы построить t11.todense.ravel() и т. Д. Это было бы то же самое, за исключением концентрации значений, как (0,0, 0,0). Но атрибут data имеет ненулевые значения, и разреженность t11 и t21 одинакова, поэтому мы можем просто построить эти - только 28 значений в этом случае:

plt.plot(t11.data,
         t21.data,
         'ko',
         alpha=0.1);

Могут быть и другие способы получения матриц t11 и t21, но основная идея по-прежнему применима - получить две матрицы с одинаковой разреженностью и построить только их значения data.

imaget1vst2">

imaget11.data vs t21.data">

...