如何在numpy中导出布尔矩阵?
我有一个图,用一个numpy的布尔数组表示(G.adj.dtype == bool
)。这是我自己写图形库的作业,所以不能用networkx。我想把它保存到一个文件里,好让我可以随意修改,但我就是搞不定怎么让numpy把它保存成可以恢复的格式。
我试过用G.adj.tofile
,这确实把图保存成了一长串的True/False,但用fromfile
读取的时候出错了,只得到一个1x1的数组,而loadtxt
则报了个ValueError: invalid literal for int
的错误。np.savetxt
可以用,但它把矩阵保存成了0和1的浮点数列表,然后用loadtxt(..., dtype=bool
读取时又出现了同样的ValueError。
最后,我试了用networkx.from_numpy_matrix
和networkx.write_dot
,但这样每条边都变成了[weight=True]
,导致networkx.read_dot
无法正常工作。
4 个回答
这是我的测试案例:
m = numpy.random(100,100) > 0.5
空间效率
numpy.savetxt('arr.txt', obj, fmt='%s')
创建了一个54 kB的文件。
numpy.savetxt('arr.txt', obj, fmt='%d')
创建了一个更小的文件(20 kB)。
cPickle.dump(obj, open('arr.dump', 'w'))
,这个创建了一个40 kB的文件。
时间效率
numpy.savetxt('arr.txt', obj, fmt='%s')
花费了45毫秒。
numpy.savetxt('arr.txt', obj, fmt='%d')
花费了10毫秒。
cPickle.dump(obj, open('arr.dump', 'w'))
,花费了2.3毫秒。
结论
如果需要人类可读的格式,就用 savetxt
的文本格式(%s
);如果空间占用是个问题,就用 savetxt
的数字格式(%d
);如果时间是个问题,就用 cPickle
。
保存你的数组以及一些额外信息(比如数据类型和维度)最简单的方法是使用 numpy.save()
和 numpy.load()
。
a = array([[False, True, False],
[ True, False, True],
[False, True, False],
[ True, False, True],
[False, True, False]], dtype=bool)
numpy.save("data.npy", a)
numpy.load("data.npy")
# array([[False, True, False],
# [ True, False, True],
# [False, True, False],
# [ True, False, True],
# [False, True, False]], dtype=bool)
另外,a.tofile()
和 numpy.fromfile()
也可以用来保存和加载数据,但它们不会保存任何额外的信息。使用 fromfile()
时,你需要指定 dtype=bool
,这样得到的将是一个一维数组,你还得用 reshape()
把它变回原来的形状。
保存的方法:
numpy.savetxt('arr.txt', G.adj, fmt='%s')
恢复的方法:
G.adj = numpy.genfromtxt('arr.txt', dtype=bool)
希望这对你有帮助!