Python 矩阵列求和与倒数的有效方法
我正在处理高达百万X百万的大型矩阵。我想对矩阵中的每一列求和,并将每一列和的倒数放在非零元素所在的相应列元素中。我对此做了两次尝试,但我仍然想要一种更快的计算方法,因为有些列是零,所以无法直接计算np.倒数。 以下是我的尝试:Python 矩阵列求和与倒数的有效方法,python,matrix,scipy,Python,Matrix,Scipy,我正在处理高达百万X百万的大型矩阵。我想对矩阵中的每一列求和,并将每一列和的倒数放在非零元素所在的相应列元素中。我对此做了两次尝试,但我仍然想要一种更快的计算方法,因为有些列是零,所以无法直接计算np.倒数。 以下是我的尝试: 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.errst
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稀疏矩阵格式会使它更快吗
讨论各种除零选项。被接受的答案看起来很像你的第一次尝试。但有一个新的答案可能更快
您的示例太小,无法对其进行有意义的时间测试。除了我的评论之外,我对相对速度没有任何直觉
最近的一个SO问题指出,在最新版本1.13中,where需要out参数,但在早期版本中是可选的。最慢的部分是什么?总数是多少?分歧?测试?对于较大的d,我预计迭代会非常缓慢。除非你的矩阵是非常稀疏的,否则10%或更少的稀疏矩阵是没有帮助的。稀疏行和返回一个稠密矩阵。
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. ])