如何解决AttributeError: 'generator' object has no attribute 'ndim'错误
解决AttributeError: 'generator' object has no attribute 'ndim'错误
嘿,这个问题其实很直观——你给csgraph.laplacian()传了个生成器对象,但它根本不认识这种类型!
为什么会报错?
scipy.sparse.csgraph.laplacian() 函数需要的是二维数组、scipy稀疏矩阵或者类似的结构化矩阵对象,这些类型都有ndim属性来表示维度。但你传入的cmap(也就是调用fromcmaptocoords时的参数C)是个生成器,生成器只是个迭代器,没有矩阵的维度属性,所以直接触发了AttributeError。
看你的代码片段,问题就出在get_lap(C)这一步:C是生成器,不是符合要求的矩阵。
怎么修复?
核心思路就是把生成器转换成csgraph.laplacian能处理的矩阵类型,分两种常见场景:
场景1:生成器逐行输出矩阵数据
如果你的生成器每次yield一行矩阵的数值(比如[1,0,1]这样的行向量),直接把它转成numpy数组就行:
def fromcmaptocoords(C): # 把生成器转换成二维numpy数组 C_matrix = np.array(list(C)) L = get_lap(C_matrix) eigw, eigv = LA.eigh(L.todense()) vecs = eigv[:,1:3] guess_coords = pd.DataFrame(data=vecs, columns=["x", "y"]) return guess_coords
场景2:生成器输出稀疏矩阵的三元组(i,j,value)
如果生成器是在输出稀疏矩阵的坐标和对应值(比如每次输出(0,2,0.5)这样的三元组),可以直接用scipy的稀疏矩阵构造器转换:
def fromcmaptocoords(C): # 把生成器的三元组转换成coo格式稀疏矩阵,再转成csc rows, cols, vals = zip(*list(C)) C_matrix = scipy.sparse.coo_matrix((vals, (rows, cols))).tocsc() L = get_lap(C_matrix) eigw, eigv = LA.eigh(L.todense()) vecs = eigv[:,1:3] guess_coords = pd.DataFrame(data=vecs, columns=["x", "y"]) return guess_coords
额外小提示
- 先确认生成器的输出结构:可以先临时加一行
print(list(C))看看里面的元素是什么样的,确保转换后的矩阵是二维的(csgraph.laplacian只认二维结构)。 - 如果生成器数据量特别大,转成
list可能占内存,但拉普拉斯矩阵计算需要完整的矩阵数据,所以还是得先把生成器的内容转换成完整的矩阵对象才行。
内容的提问来源于stack exchange,提问作者Sofia Farina
相关产品推荐
相关产品推荐

