我需要计算以下矩阵表达式: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]]
。
X
和T
都是矢量。问题是X.dot(T.T)
和Y
都有较大的尺寸(比如350 x 23 000 000
),因此Y
存储为scipy.sparse.csc_matrix
,其值约为2亿。我没有足够的内存来存储中间XT
结果。
当然,可以迭代Y
的所有非零元素并手动计算XT
的每个元素,然后手动构造结果csc_matrix
。结果将与indices
具有相同的indptr
和Y
属性,这使我认为应该有更短或更快的方式。
答案 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]])