我正在使用Python 2.7和networkx绘制网络的弹簧布局图。为了比较不同的设置,我想将networkx计算和使用的位置存储到文件中(目前我的选择是csv),并在每次进行新绘图时都读取它。听起来很简单,我的代码如下:
pos_spring = nx.spring_layout(H, pos=fixed_positions, fixed = fixed_nodes, k = 4, weight='passengers')
此行计算以后要存储的绘图位置。字典(pos_spring)看起来像这样:
{1536: array([ 0.53892015, 0.984306 ]),
1025: array([ 0.12096853, 0.82587976]),
1030: array([ 0.20388712, 0.7046137 ]),
写入文件:
w = csv.writer(open("Mexico_spring_layout_positions_2.csv", "w"))
for key, val in pos_spring.items():
w.writerow([key, val])
文件内容如下:
1536,[ 0.51060853 0.80129841]
1025,[ 0.47442269 0.99838177]
1030,[ 0.02952256 0.45073233]
正在读取文件:
with open('Mexico_spring_layout_positions_2.csv', mode='r') as infile:
reader = csv.reader(infile)
pos_spring = dict((rows[0],rows[1]) for rows in reader)
pos_spring的内容现在看起来像这样:
{'2652': '[ 0.78480322 0.103894 ]',
'1260': '[ 0.8834103 0.82542163]',
'2969': '[ 0.33044548 0.31282113]',
该数据看起来与原始字典不同,后者存储在csv文件中。为了解决此问题,在写入和/或读取数据时需要更改什么?预先感谢。
亲切的问候, 弗兰克
答案 0 :(得分:2)
您不能将NumPy数组存储在CSV文件中,也不能维护数据类型。请记住,CSV文件只能存储文本。您所看到的是NumPy数组的文本表示形式。
相反,您可以在写入csv文件时解压缩NumPy数组:
import csv
d = {1536: np.array([ 0.53892015, 0.984306 ]),
1025: np.array([ 0.12096853, 0.82587976]),
1030: np.array([ 0.20388712, 0.7046137 ])}
fp = r'C:\temp\out.csv'
with open(fp, 'w', newline='') as fout:
w = csv.writer(fout)
for key, val in d.items():
w.writerow([key, *val])
然后在您读回时转换回NumPy。对于此步骤,您可以使用字典理解:
with open(fp, 'r') as fin:
r = csv.reader(fin)
res = {int(k): np.array(list(map(float, v))) for k, *v in r}
print(res)
{1536: array([ 0.53892015, 0.984306 ]),
1025: array([ 0.12096853, 0.82587976]),
1030: array([ 0.20388712, 0.7046137 ])}