遍历大型稀疏数组

2024-04-19 07:34:43 发布

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


Tags: python
1条回答
网友
1楼 · 发布于 2024-04-19 07:34:43

我不知道是打字错误还是代码错误,但您的示例缺少iternext

R=[]
it = np.nditer ( A, flags=['multi_index'] )
while not it.finished:
    if it[0]:
        R.append(M[it.multi_index])
    it.iternext()

我认为添加到列表比R[ctnr]=...更简单、更快。如果R是一个规则数组,而稀疏索引速度较慢(甚至是最快的lil格式),那么它就很有竞争力。你知道吗

ndindex将nditer的这种用法包装为:

R=[]
for index in np.ndindex(A.shape):
    if A[index]:
        R.append(M[index])

ndenumerate同样有效:

R = []
for index,a in np.ndenumerate(A):
   if a:
       R.append(M[index])

但是我想知道你是否真的想推进cntr每个it步骤,而不仅仅是True案例。否则,将result重塑为(N,N)就没什么意义了。但是那样的话,你的问题不就是

M[:N, :N].multiply(A)

或者如果M是密集数组:

M[:N, :N]*A

实际上,如果MA都是稀疏的,那么multiply.data属性将与R列表相同。你知道吗

In [76]: N=4
In [77]: M=np.arange(N*N*N*N).reshape(N*N,N*N)
In [80]: a=np.array([0,1,0,1])
In [81]: A=np.einsum('i,j',a,a)
In [82]: A
Out[82]: 
array([[0, 0, 0, 0],
       [0, 1, 0, 1],
       [0, 0, 0, 0],
       [0, 1, 0, 1]])

In [83]: M[:N, :N]*A
Out[83]: 
array([[ 0,  0,  0,  0],
       [ 0, 17,  0, 19],
       [ 0,  0,  0,  0],
       [ 0, 49,  0, 51]])

In [84]: c=sparse.csr_matrix(M)[:N,:N].multiply(sparse.csr_matrix(A))
In [85]: c.data
Out[85]: array([17, 19, 49, 51], dtype=int32)

In [89]: [M[index] for index, a in np.ndenumerate(A) if a]
Out[89]: [17, 19, 49, 51]

相关问题 更多 >