使用nx.from_numpy_array构建图时遇未知numpy数据类型object错误
解决NetworkX from_numpy_array无法识别object数据类型的问题
问题场景
执行以下代码构建有向图时出现报错:
mat_L1 = mat_L1_df.to_numpy()[1:,1:] L1_G = nx.from_numpy_array(mat_L1, parallel_edges=False, create_using=nx.DiGraph)
报错信息:
KeyError: 'O' TypeError: Unknown numpy data type: object
原因是nx.from_numpy_array仅支持数值类型的numpy数组,而你的mat_L1是object类型数组(可能包含字符串、混合类型或非数值数据),导致无法解析。
解决方法
方法1:转换数组为数值类型
如果数组内容本质是数值,只是存储为object类型,直接用astype转换:
# 根据实际数据选择float或int mat_L1 = mat_L1_df.to_numpy()[1:,1:].astype(float) # 或者 mat_L1 = mat_L1_df.to_numpy()[1:,1:].astype(int)
注意:若数组包含非数值元素,转换会抛出异常,需先清理数据。
方法2:清理并转换非数值元素
如果数组存在非数值内容(如空字符串、None),先定义转换规则处理后再转数值:
import numpy as np def convert_to_numeric(x): try: return float(x) except (ValueError, TypeError): return 0.0 # 可根据需求替换为其他默认值 # 批量处理数组元素 mat_L1 = np.vectorize(convert_to_numeric)(mat_L1_df.to_numpy()[1:,1:])
方法3:直接从DataFrame构建图(推荐)
绕开numpy数组转换,使用NetworkX提供的from_pandas_adjacency方法直接从DataFrame创建图:
# 截取目标邻接矩阵部分(去掉首行首列) adjacency_df = mat_L1_df.iloc[1:, 1:] L1_G = nx.from_pandas_adjacency(adjacency_df, create_using=nx.DiGraph)
该方法会自动处理DataFrame中的数据类型,适配性更强。
内容的提问来源于stack exchange,提问作者user24015087
相关产品推荐
相关产品推荐

