【问题标题】:efficient way of column sum and reciprocal in a matrix矩阵中列和和倒数的有效方法
【发布时间】:2017-06-26 03:39:46
【问题描述】:

我正在处理大型矩阵(高达百万 X 百万)。我想对矩阵中的每一列进行列求和,并将每列总和的倒数放在存在非零元素的相应列元素中。我已经完成了对此进行了两次尝试,但我仍然想要一种更快的计算方法,并且由于某些列为零,因此无法直接执行 np.reciprocal。 以下是我的尝试:

A=np.array([[0,1,1,1],[0,0,1,0],[0,1,0,0],[0,0,0,0]])
d=sc.shape(A)[0]


V=sc.zeros(d)

sc.sum(A,axis=0,out=V,dtype='int')
with sc.errstate(divide='ignore', invalid='ignore'):

    Vs = sc.true_divide( 1, V )
    Vs[ ~ sc.isfinite( Vs )] = 0  # -inf inf NaN

print Vs

第二次尝试:

A=np.array([[0,1,1,1],[0,0,1,0],[0,1,0,0],[0,0,0,0]])
d=sc.shape(A)[0]

V=sc.zeros(d)

sc.sum(A,axis=0,out=V,dtype='int')

for i in range(0,d):
    if V[i]!=0:                       
        V[i]=1/V[i]
print V

还有比这更快的方法吗?因为我的运行时间很差。 谢谢

edit1:您认为将所有内容更改为 csr 稀疏矩阵格式会使其更快吗?

【问题讨论】:

  • 什么是慢的部分?总和?划分?测试?对于大的d,我预计迭代会很慢。除非您的矩阵非常稀疏(10% 或更少),否则稀疏矩阵将无济于事。并且稀疏行和返回一个密集矩阵。

标签: python matrix scipy


【解决方案1】:

NumPy: Return 0 with divide by zero

讨论了各种除以零的选项。接受的答案看起来很像您的第一次尝试。但是有一个新的答案可能(?)更快

https://stackoverflow.com/a/37977222/901925

In [240]: V=A.sum(axis=0)
In [241]: np.divide(1,V,out=np.zeros(V.shape),where=V>0)
Out[241]: array([ 0. ,  0.5,  0.5,  1. ])

您的示例太小,无法进行有意义的时间测试。我对相对速度没有任何直觉(超出我的评论)。

最近的一个 SO 问题指出,out 参数在最新版本 (1.13) 中是必需的,where 是必需的,但在早期版本中是可选的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-03
    • 1970-01-01
    • 2020-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-30
    相关资源
    最近更新 更多