保留大型矩阵产品的特定元素

时间:2014-06-28 21:41:12

标签: numpy scipy sparse-matrix

我需要计算以下矩阵表达式:XT - Y并保持元素仅对应于矩阵Y 的非零元素。例如,如果:

In [63]: X.dot(T.T) - Y
Out[63]: array([[ -6,  -2], [ -9, -12]])
In [64]: Y
Out[64]: array([[5, 0], [7, 8]])

然后结果应为[[-6, 0], [-9, -12]]

XT都是矢量。问题是X.dot(T.T)Y都有较大的尺寸(比如350 x 23 000 000),因此Y存储为scipy.sparse.csc_matrix,其值约为2亿。我没有足够的内存来存储中间XT结果。

当然,可以迭代Y的所有非零元素并手动计算XT的每个元素,然后手动构造结果csc_matrix。结果将与indices具有相同的indptrY属性,这使我认为应该有更短或更快的方式。

1 个答案:

答案 0 :(得分:5)

这是你可以做到的一种方式。

首先,一些示例数据:

In [75]: X.T
Out[75]: array([[1, 2, 3]])

In [76]: T.T
Out[76]: array([[2, 3, 5, 7]])

In [77]: Y
Out[77]: 
<3x4 sparse matrix of type '<type 'numpy.int64'>'
    with 5 stored elements in Compressed Sparse Column format>

In [78]: Y.A
Out[78]: 
array([[0, 0, 4, 5],
       [6, 0, 0, 7],
       [0, 8, 0, 0]])

Y转换为COO格式(因此非零数据的行索引和列索引随时可用):

In [79]: C = Y.tocoo()

计算X.dot(T.T) - Y的等效值,但仅适用于Y非零的值:

In [80]: data = X[C.row,0]*T[C.col,0] - C.data

In [81]: data
Out[81]: array([-2,  1,  1,  2,  7])

与完整计算相比:

In [82]: X.dot(T.T) - Y
Out[82]: 
matrix([[ 2,  3,  1,  2],
        [-2,  6, 10,  7],
        [ 6,  1, 15, 21]])

如果您需要像Y这样的CSC矩阵中的结果:

In [84]: D = csc_matrix((data, (C.row, C.col)), shape=C.shape)

In [85]: D
Out[85]: 
<3x4 sparse matrix of type '<type 'numpy.int64'>'
    with 5 stored elements in Compressed Sparse Column format>

In [86]: D.A
Out[86]: 
array([[ 0,  0,  1,  2],
       [-2,  0,  0,  7],
       [ 0,  1,  0,  0]])