矩阵中列和和矩的有效方法

时间:2017-06-25 18:03:59

标签: python matrix scipy

我正在使用大型矩阵(高达百万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稀疏矩阵格式会使其更快吗?

1 个答案:

答案 0 :(得分:1)

NumPy: Return 0 with divide by zero

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

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

    ' Translate to a new XY coordinate in preparation for the placement of the image
PDF::setXY($x, $y);

    ' Start the transformation including the clipping according to the given shape and then rotating as per the rotation parameter
PDF::StartTransform();

    ' Clipping Rectangle
PDF::Rect($rectx, $recty, $rectwidth, $rectheight, 'CNZ');

    ' Rotate
PDF::Rotate($objectImageRotation * -1);

    ' Place the image at the set rotation
PDF::Image($objectImageSrc, $x, $y, $width, $height, '', '', '', true, 300, '', false, false, ($objectBorderWidth > 0 ? 1 : 0), false, false, false);

    ' Stop the transformation (reset)
PDF::StopTransform();

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

最近的一个问题指出,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. ]) 参数在最新版本(1.13)中需要out,但在早期版本中是可选的。