我正在使用大型矩阵(高达百万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稀疏矩阵格式会使其更快吗?
答案 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
,但在早期版本中是可选的。