将稀疏矩阵的值赋给numpy数组

2024-04-19 11:16:53 发布

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

import numpy as np
import scipy.sparse as scsp
from scipy.sparse import csr_matrix,lil_matrix

# create an empty numpy matrix
wi=np.empty((num_clusters*num_cluster_neurons, input))   
for i in range(num_clusters*num_cluster_neurons):         
    temp_neuron_prob=dic_cluster_prob[dic_neuron_cluster[i]]

    #create 1*input shape sparse matrix according to probability
    lil=lil_matrix(scsp.rand(1, input, temp_neuron_prob))

    #want to assign the 1*input sparse matrix to one slice of the numpy matrix
    wi[i,:]=lil[:]

我试图将一个lil峎矩阵的值赋给numpy数组的一个片段,但是它给出了一个错误“用一个序列设置一个数组元素”

我想知道为什么会出现这样的错误,因为它们的大小相同,而且我如何才能提高效率,因为numpy数组比稀疏矩阵(lil_matrix)快。在

我想使用numpy数组来获得由稀疏矩阵创建的值


Tags: toimportnumpyinputasnp矩阵数组
1条回答
网友
1楼 · 发布于 2024-04-19 11:16:53

稀疏矩阵不是数组子类(比如np.matrix),也不一定像一个数组子类(尽管在很多方面它确实尝试过)。在

In [129]: arr = np.zeros((3,4),int)
In [130]: M = sparse.lil_matrix([0,1,2,0])
In [131]: M.shape
Out[131]: (1, 4)
In [132]: arr[0,:] = M
...
ValueError: setting an array element with a sequence.

但如果我首先将稀疏矩阵转换为数组或矩阵,则赋值有效:

^{pr2}$

一般来说,稀疏矩阵不能插入numpy代码中。例外情况是,numpy代码将任务委托给对象自己的方法。在

看起来你正在尝试生成类似于:

In [148]: arr = np.zeros((3,5),float)
In [149]: for i in range(arr.shape[0]):
     ...:     arr[i,:] = sparse.rand(1,5, .2*(i+1)).A
     ...:     
In [150]: arr
Out[150]: 
array([[ 0.        ,  0.        ,  0.82470353,  0.        ,  0.        ],
       [ 0.        ,  0.43339367,  0.99427277,  0.        ,  0.        ],
       [ 0.        ,  0.99843277,  0.05182824,  0.1705916 ,  0.        ]])

纯粹的稀疏等价物可能是:

In [151]: alist = []
In [152]: for i in range(3):
     ...:     alist.append(sparse.rand(1,5, .2*(i+1)))
     ...:     
     ...:     
In [153]: alist
Out[153]: 
[<1x5 sparse matrix of type '<class 'numpy.float64'>'
    with 1 stored elements in COOrdinate format>,
 <1x5 sparse matrix of type '<class 'numpy.float64'>'
    with 2 stored elements in COOrdinate format>,
 <1x5 sparse matrix of type '<class 'numpy.float64'>'
    with 3 stored elements in COOrdinate format>]
In [154]: sparse.vstack(alist)
Out[154]: 
<3x5 sparse matrix of type '<class 'numpy.float64'>'
    with 6 stored elements in COOrdinate format>
In [155]: _.A
Out[155]: 
array([[ 0.        ,  0.        ,  0.        ,  0.19028467,  0.        ],
       [ 0.        ,  0.        ,  0.        ,  0.92668274,  0.67424419],
       [ 0.96208905,  0.63604635,  0.        ,  0.69463657,  0.        ]])

但是考虑到sparse.vstack使用稀疏bmat将矩阵连接成一个新的矩阵,bmat结合了组件的coo属性,密集数组累加方法可能会更快。在

相关问题 更多 >