读写带有CSV文件的NumPy数组的字典

时间:2018-07-17 12:14:01

标签: python python-2.7 csv numpy dictionary

我正在使用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文件中。为了解决此问题,在写入和/或读取数据时需要更改什么?预先感谢。

亲切的问候, 弗兰克

1 个答案:

答案 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 ])}