2009-12-29 1 views
1
>>> idmapfile = open("idmap", mode="w") 
    >>> pickle.dump(idMap, idmapfile) 
    >>> idmapfile.close() 
    >>> idmapfile = open("idmap") 
    >>> unpickled = pickle.load(idmapfile) 
    >>> unpickled == idMap 
False 
idMap[1] 
{1537: (552, 1, 1537, 17.793827056884766, 3), 1540: (4220, 1, 1540, 19.31205940246582, 3), 1544: (592, 1, 1544, 18.129131317138672, 3), 1675: (529, 1, 1675, 18.347782135009766, 3), 1550: (4048, 1, 1550, 19.31205940246582, 3), 1424: (1528, 1, 1424, 19.744396209716797, 3), 1681: (1265, 1, 1681, 19.596025466918945, 3), 1560: (3457, 1, 1560, 20.530569076538086, 3), 1690: (477, 1, 1690, 17.395542144775391, 3), 1691: (554, 1, 1691, 13.446117401123047, 3), 1436: (3010, 1, 1436, 19.596025466918945, 3), 1434: (3183, 1, 1434, 19.744396209716797, 3), 1441: (3570, 1, 1441, 20.589576721191406, 3), 1435: (476, 1, 1435, 19.640911102294922, 3), 1444: (527, 1, 1444, 17.98480224609375, 3), 1478: (1897, 1, 1478, 19.596025466918945, 3), 1575: (614, 1, 1575, 19.371648788452148, 3), 1586: (2189, 1, 1586, 19.31205940246582, 3), 1716: (3470, 1, 1716, 19.158674240112305, 3), 1590: (2278, 1, 1590, 19.596025466918945, 3), 1463: (991, 1, 1463, 19.31205940246582, 3), 1594: (1890, 1, 1594, 19.596025466918945, 3), 1467: (1087, 1, 1467, 19.31205940246582, 3), 1596: (3759, 1, 1596, 19.744396209716797, 3), 1602: (3011, 1, 1602, 20.530569076538086, 3), 1547: (490, 1, 1547, 17.994071960449219, 3), 1605: (658, 1, 1605, 19.31205940246582, 3), 1606: (1794, 1, 1606, 16.964881896972656, 3), 1719: (1826, 1, 1719, 19.596025466918945, 3), 1617: (583, 1, 1617, 11.894925117492676, 3), 1492: (3441, 1, 1492, 20.500667572021484, 3), 1622: (3215, 1, 1622, 19.31205940246582, 3), 1628: (2761, 1, 1628, 19.744396209716797, 3), 1502: (1563, 1, 1502, 19.596025466918945, 3), 1632: (1108, 1, 1632, 15.457141876220703, 3), 1468: (3779, 1, 1468, 19.596025466918945, 3), 1642: (3970, 1, 1642, 19.744396209716797, 3), 1518: (612, 1, 1518, 18.570245742797852, 3), 1647: (854, 1, 1647, 16.964881896972656, 3), 1650: (2099, 1, 1650, 20.439058303833008, 3), 1651: (540, 1, 1651, 18.552841186523438, 3), 1653: (613, 1, 1653, 19.237197875976563, 3), 1532: (537, 1, 1532, 18.885730743408203, 3)} 

>>> unpickled[1] 
{1537: (64880, 1638, 56700, -1.0808743559293829e+18, 152), 1540: (64904, 1638, 0, 0.0, 0), 1544: (54472, 1490, 0, 0.0, 0), 1675: (6464, 1509, 0, 0.0, 0), 1550: (43592, 1510, 0, 0.0, 0), 1424: (43616, 1510, 0, 0.0, 0), 1681: (0, 0, 0, 0.0, 0), 1560: (400, 152, 400, 2.1299736657737219e-43, 0), 1690: (408, 152, 408, 2.7201111331839077e+26, 34), 1435: (424, 152, 61512, 1.0122952080313192e-39, 0), 1436: (400, 152, 400, 20.250289916992188, 3), 1434: (424, 152, 62080, 1.0122952080313192e-39, 0), 1441: (400, 152, 400, 12.250144958496094, 3), 1691: (424, 152, 42608, 15.813941955566406, 3), 1444: (400, 152, 400, 19.625289916992187, 3), 1606: (424, 152, 42432, 5.2947192852601414e-22, 41), 1575: (400, 152, 400, 6.2537390010262572e-36, 0), 1586: (424, 152, 42488, 1.0122601755697111e-39, 0), 1716: (400, 152, 400, 6.2537390010262572e-36, 0), 1590: (424, 152, 64144, 1.0126357235581501e-39, 0), 1463: (400, 152, 400, 6.2537390010262572e-36, 0), 1594: (424, 152, 32672, 17.002994537353516, 3), 1467: (400, 152, 400, 19.750289916992187, 3), 1596: (424, 152, 7176, 1.0124003054161436e-39, 0), 1602: (400, 152, 400, 18.500289916992188, 3), 1547: (424, 152, 7000, 1.0124003054161436e-39, 0), 1605: (400, 152, 400, 20.500289916992188, 3), 1478: (424, 152, 42256, -6.0222748507426518e+30, 222), 1719: (400, 152, 400, 6.2537390010262572e-36, 0), 1617: (424, 152, 16472, 1.0124283313854301e-39, 0), 1492: (400, 152, 400, 6.2537390010262572e-36, 0), 1622: (424, 152, 35304, 1.e-39, 0), 1628: (400, 152, 400, 6.2537390010262572e-36, 0), 1502: (424, 152, 63152, 19.627988815307617, 3), 1632: (400, 152, 400, 19.375289916992188, 3), 1468: (424, 152, 38088, 1.0124213248931084e-39, 0), 1642: (400, 152, 400, 6.2537390010262572e-36, 0), 1518: (424, 152, 63896, 1.0127436235399031e-39, 0), 1647: (400, 152, 400, 6.2537390010262572e-36, 0), 1650: (424, 152, 53424, 16.752857208251953, 3), 1651: (400, 152, 400, 19.250289916992188, 3), 1653: (424, 152, 50624, 1.0126497365427934e-39, 0), 1532: (400, 152, 400, 6.2537390010262572e-36, 0)} 

Ключи выдаются отлично, значения прикручиваются. Я попробовал загрузку одного файла в двоичном режиме; не исправить проблему. Любая идея, что я делаю неправильно?Python - травление не работает для объектов numpy.void


Edit: Вот код с двоичным. Обратите внимание, что значения различаются в незакрашенном объекте.

>>> idmapfile = open("idmap", mode="wb") 
>>> pickle.dump(idMap, idmapfile) 
>>> idmapfile.close() 
>>> idmapfile = open("idmap", mode="rb") 
>>> unpickled = pickle.load(idmapfile) 
>>> unpickled==idMap 
False 
>>> unpickled[1] 
{1537: (12176, 2281, 56700, -1.0808743559293829e+18, 152), 1540: (0, 0, 15934, 2.7457842047810522e+26, 108), 1544: (400, 152, 400, 4.9518498821046956e+27, 53), 1675: (408, 152, 408, 2.7201111331839077e+26, 34), 1550: (456, 152, 456, -1.1349175514578289e+18, 152), 1424: (432, 152, 432, 4.5939047815653343e-40, 11), 1681: (408, 152, 408, 2.1299736657737219e-43, 0), 1560: (376, 152, 376, 2.1299736657737219e-43, 0), 1690: (376, 152, 376, 2.1299736657737219e-43, 0), 1435: (376, 152, 376, 2.1299736657737219e-43, 0), 1436: (376, 152, 376, 2.1299736657737219e-43, 0), 1434: (376, 152, 376, 2.1299736657737219e-43, 0), 1441: (376, 152, 376, 2.1299736657737219e-43, 0), 1691: (376, 152, 376, 2.1299736657737219e-43, 0), 1444: (376, 152, 376, 2.1299736657737219e-43, 0), 1606: (25784, 2281, 376, -3.2883343074537754e+26, 34), 1575: (24240, 2281, 376, 2.1299736657737219e-43, 0), 1586: (24240, 2281, 376, 2.1299736657737219e-43, 0), 1716: (24240, 2281, 376, -3.0093091599657311e-35, 26), 1590: (24240, 2281, 376, 2.1299736657737219e-43, 0), 1463: (24240, 2281, 376, 2.1299736657737219e-43, 0), 1594: (24240, 2281, 376, -4123208450048.0, 196), 1467: (25784, 2281, 376, 2.1299736657737219e-43, 0), 1596: (25784, 2281, 376, 2.1299736657737219e-43, 0), 1602: (25784, 2281, 376, -5.9963281433905448e+26, 76), 1547: (25784, 2281, 376, -218106240.0, 139), 1605: (25784, 2281, 376, -3.7138649803377281e+27, 56), 1478: (376, 152, 376, 2.1299736657737219e-43, 0), 1719: (25784, 2281, 376, 2.1299736657737219e-43, 0), 1617: (25784, 2281, 376, -1.4411779941597184e+17, 237), 1492: (25784, 2281, 376, 2.8596493694487798e-30, 80), 1622: (25784, 2281, 376, 184686084096.0, 93), 1628: (1336, 152, 1336, 3.1691839245470052e+29, 179), 1502: (1272, 152, 1272, -5.2042207205116645e-17, 99), 1632: (1208, 152, 1208, 2.1299736657737219e-43, 0), 1468: (1144, 152, 1144, 2.1299736657737219e-43, 0), 1642: (1080, 152, 1080, 2.1299736657737219e-43, 0), 1518: (1016, 152, 1016, 4.0240902787680023e+35, 145), 1647: (952, 152, 952, -985172619034624.0, 237), 1650: (888, 152, 888, 12094787289088.0, 66), 1651: (824, 152, 824, 2.1299736657737219e-43, 0), 1653: (760, 152, 760, 0.00018310768064111471, 238), 1532: (696, 152, 696, 8.8978061885676389e+26, 125)} 

ОК Я изолировали проблему, но не знаю, почему это так. Во-первых, очевидно, что я травляю не кортежи (хотя они выглядят как это), а вместо numpy.void типов. Вот серия, иллюстрирующая проблему.

first = run0.detections[0] 
>>> first 
(1, 19, 1578, 82.637763977050781, 1) 
>>> type(first) 
<type 'numpy.void'> 
>>> firstTuple = tuple(first) 
>>> theFile = open("pickleTest", "w") 
>>> pickle.dump(first, theFile) 
>>> theTupleFile = open("pickleTupleTest", "w") 
>>> pickle.dump(firstTuple, theTupleFile) 
>>> theFile.close() 
>>> theTupleFile.close() 
>>> first 
(1, 19, 1578, 82.637763977050781, 1) 
>>> firstTuple 
(1, 19, 1578, 82.637764, 1) 
>>> theFile = open("pickleTest", "r") 
>>> theTupleFile = open("pickleTupleTest", "r") 
>>> unpickledTuple = pickle.load(theTupleFile) 
>>> unpickledVoid = pickle.load(theFile) 
>>> type(unpickledVoid) 
<type 'numpy.void'> 
>>> type(unpickledTuple) 
<type 'tuple'> 
>>> unpickledTuple 
(1, 19, 1578, 82.637764, 1) 
>>> unpickledTuple == firstTuple 
True 
>>> unpickledVoid == first 
False 
>>> unpickledVoid 
(7936, 1705, 56700, -1.0808743559293829e+18, 152) 
>>> first 
(1, 19, 1578, 82.637763977050781, 1) 
+1

показать нам тот же самый код с двоичным режиме записи и чтения. – SilentGhost

+0

Нет ничего плохого в этом коде. Я попробовал, и все прошло отлично. Однако я не был уверен, что вы травляете, я использовал массив диктонов, потому что это выглядело похоже. – Pace

+0

Работает для меня в Python 2.4.5, 2.5.2 и с очевидными изменениями в Python 3.0. Пожалуйста, отправьте фактические данные испытаний, для которых он не работает. Также, какую версию рассола вы используете? рассол, или cPickle? – novalis

ответ

0

так, травление будет работать только с функциями модуля верхнего уровня и классами, а также будет не рассортировать данные класса, поэтому, если требуется некоторый код/​​данные класса numpy, чтобы создать представление о том, как маятник типа numpy не будет работать, как ожидалось. Возможно, что пакет numpy реализовал внутреннюю редакцию, чтобы напечатать тип void как кортеж, если это так, то то, что вы мариновали, конечно, не будет тем, что вы напечатали. - jottos Дек 29, 2009 в 18:42

0

Что-то с вашей системой (файловая система?); Я бы попробовал травление в двоичном режиме; используйте dump(idMap, idmapfile, protocol=2)

+0

Не исправить проблему - тот же результат. – I82Much

0

Итак, используя python31, я сделал небольшое изменение к вашему примеру, и он отлично работал. Обратите внимание, что я добавил «Ъ» двоичный в файл открытых лет я пытался это со всеми протоколами, и она работала для каждого

idmapfile = open("idmap", mode="wb") 
pickle.dump(idMap, idmapfile) 
idmapfile.close() 
idmapfile = open("idmap", "rb") 
unpickled = pickle.load(idmapfile) 
print ('they are equal', unpickled == idMap) 


src> ./pick.py 
they are equal True 
1

Я согласен. Я думаю, что есть проблема с сериализации numpy.void

пример, который не работает (Python 2.7.3, NumPy 1.6.1):

import pickle, numpy as np 
my_array = np.array([('hello', 45.5, 'world')], dtype=[('a', str, 10), ('b', float), ('c', str,10)]) 
my_void = my_array[0] 
print my_void 
print pickle.loads(pickle.dumps(my_void)) 

, который будет печатать:

('hello', 45.5, 'world') 
('\xc0\x00llo', 45.5, 'world') 

Первый выглядит как tuple, но это на самом деле numpy.void

Таким образом, чтобы избежать этого, вы не можете иметь numpy.void, вместо него вы должны обернуть пустоту numpy.array() или позвоните по номеру .tolist() на numpy.void.

Edit: Существует ошибка в NumPy https://github.com/numpy/numpy/pull/3188

Смежные вопросы