【发布时间】: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% 或更少),否则稀疏矩阵将无济于事。并且稀疏行和返回一个密集矩阵。