如何在numpy中导出布尔矩阵?

6 投票
4 回答
3348 浏览
提问于 2025-04-16 08:56

我有一个图,用一个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_matrixnetworkx.write_dot,但这样每条边都变成了[weight=True],导致networkx.read_dot无法正常工作。

4 个回答

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

4

保存你的数组以及一些额外信息(比如数据类型和维度)最简单的方法是使用 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() 把它变回原来的形状。

5

保存的方法:

numpy.savetxt('arr.txt', G.adj, fmt='%s')

恢复的方法:

G.adj = numpy.genfromtxt('arr.txt', dtype=bool)

希望这对你有帮助!

撰写回答