首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >保留大型矩阵积的特定元素

保留大型矩阵积的特定元素
EN

Stack Overflow用户
提问于 2014-06-28 21:41:11
回答 1查看 36关注 0票数 2

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

代码语言:javascript
运行
复制
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被存储为一个值约为2亿的scipy.sparse.csc_matrix。我没有足够的内存来存储中间的XT结果。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-28 22:22:55

有一种方法你可以做到。

首先,一些样本数据:

代码语言:javascript
运行
复制
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格式(因此非零数据的行和列索引随时可用):

代码语言:javascript
运行
复制
In [79]: C = Y.tocoo()

计算X.dot(T.T) - Y的等效值,但只计算Y为非零的值:

代码语言:javascript
运行
复制
In [80]: data = X[C.row,0]*T[C.col,0] - C.data

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

与完整的计算相比:

代码语言:javascript
运行
复制
In [82]: X.dot(T.T) - Y
Out[82]: 
matrix([[ 2,  3,  1,  2],
        [-2,  6, 10,  7],
        [ 6,  1, 15, 21]])

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

代码语言:javascript
运行
复制
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]])
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24471221

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档