Как свалить булеву матрицу в numpy? - PullRequest
6 голосов
/ 23 декабря 2010

У меня есть график, представленный в виде пустого логического массива (G.adj.dtype == bool). Это домашняя работа по написанию моей собственной библиотеки графов, поэтому я не могу использовать networkx. Я хочу записать его в файл, чтобы я мог поиграть с ним, но я не могу понять, как сделать его полностью восстанавливаемым способом.

Я попытался G.adj.tofile, который правильно написал график (ish) как одну длинную строку True / False. Но fromfile barfs при чтении этого, давая массив 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 ]

4 голосов
/ 23 декабря 2010

Это мой тестовый пример:

m = numpy.random(100,100) > 0.5

эффективность использования пространства

numpy.savetxt('arr.txt', obj, fmt='%s') создает файл размером 54 КБ.

numpy.savetxt('arr.txt', obj, fmt='%d') создает файл намного меньшего размера (20 КБ).

cPickle.dump(obj, open('arr.dump', 'w')), который создает файл размером 40 КБ,

эффективность по времени

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 голосов
/ 24 декабря 2010

Самый простой способ сохранить ваш массив, включая метаданные (dtype, размеры), это использовать 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() также будут работать, но не сохраняйте метаданные. Вам нужно передать dtype=bool в fromfile() и получить одномерный массив, который должен быть reshape() d в своей первоначальной форме.

4 голосов
/ 23 декабря 2010

Сохранить:

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

Для восстановления:

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

НТН!

1 голос
/ 01 февраля 2013

Я знаю, что этот вопрос довольно старый, но я хочу добавить тесты Python 3. Это немного отличается от предыдущего.

Сначала я загружаю много данных в память, преобразую их в массив int8 numpy, используя только 0 и 1 в качестве возможных значений, а затем выгружаю их на жесткий диск двумя способами.

from timer import Timer
import numpy
import pickle

# Load data part of code is omitted.

prime = int(sys.argv[1])

np_table = numpy.array(check_table, dtype=numpy.int8)
filename = "%d.dump" % prime

with Timer() as t:
  pickle.dump(np_table, open("dumps/pickle_" + filename, 'wb'))

print('pickle took %.03f sec.' % (t.interval))

with Timer() as t:
  numpy.savetxt("dumps/np_" + filename, np_table, fmt='%d')

print('savetxt took %.03f sec.' % (t.interval))

Время измерения

It took 50.700 sec to load data number 11
pickle took 0.010 sec.
savetxt took 1.930 sec.

It took 1297.970 sec to load data number 29
pickle took 0.070 sec.
savetxt took 242.590 sec.

It took 1583.380 sec to load data number 31
pickle took 0.090 sec.
savetxt took 334.740 sec.

It took 3855.840 sec to load data number 41
pickle took 0.610 sec.
savetxt took 1367.840 sec.

It took 4457.170 sec to load data number 43
pickle took 0.780 sec.
savetxt took 1654.050 sec.

It took 5792.480 sec to load data number 47
pickle took 1.160 sec.
savetxt took 2393.680 sec.

It took 8101.020 sec to load data number 53
pickle took 1.980 sec.
savetxt took 4397.080 sec.

Размер измерения

630K np_11.dump
 79M np_29.dump
110M np_31.dump
442M np_41.dump
561M np_43.dump
875M np_47.dump
1,6G np_53.dump

315K pickle_11.dump
 40M pickle_29.dump
 55M pickle_31.dump
221M pickle_41.dump
281M pickle_43.dump
438M pickle_47.dump
798M pickle_53.dump

Так что версия Python 3 pickle намного быстрее, чем numpy.savetxt и использует примерно в 2 раза меньше объема жесткого диска.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...