矩阵列和倒数的有效方法

2024-06-01 10:54:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在处理大型矩阵(高达百万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稀疏矩阵格式会让它更快吗?你知道吗


Tags: 元素npzeros矩阵outarrayintvs
1条回答
网友
1楼 · 发布于 2024-06-01 10:54:29

NumPy: Return 0 with divide by zero

讨论各种被零除的选项。公认的答案看起来很像你的第一次尝试。但有一个新的答案可能(?)快点

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

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. ])

您的示例太小,无法进行有意义的时间测试。我对相对速度没有任何直觉(无可奉告)。你知道吗

最近的一个问题指出,out参数是最新版本(1.13)中where所必需的,但在早期版本中是可选的。你知道吗

相关问题 更多 >