Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 矩阵列求和与倒数的有效方法_Python_Matrix_Scipy - Fatal编程技术网

Python 矩阵列求和与倒数的有效方法

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

我正在处理高达百万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.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. ])