2014-07-15 14 views
5

Próbuję napisać plik xml za pomocą poniższego kodu:Jak wyeksportować numpy ndarray do zmiennej łańcuchowej?

def make_xml(a_numpy_array): 

    from lxml import etree as ET 

    root = ET.Element('intersections') 
    intersection = ET.SubElement(root, 'intersection') 
    trace = ET.SubElement(intersection, 'trace') 
    trace.text = a_numpy_array 

    print ET.tostring(root, pretty_print=True, xml_declaration=True, encoding = 'utf-8') 

.....

trace.text spodziewa wejście ciąg. Chcę umieścić w pliku xml tutaj tablicę 2D przechowywaną jako numpy ndarray. Ale nie mogę wyeksportować danych do łańcucha znaków. numpy.tostring podaje kod bajtowy, co mam z tym zrobić? Rozwiązaniem, które znalazłem, jest napisanie ndarray do pliku tekstowego, a następnie odczytanie pliku tekstowego jako napisu, ale chciałbym móc pominąć zapisanie pliku tekstowego.

Odpowiedz

2

Możesz użyć np.savetxt, aby napisać tablicę do io.BytesIO() (zamiast do pliku).

import numpy as np 
from lxml import etree as ET 
import io 

root = ET.Element('intersections') 
intersection = ET.SubElement(root, 'intersection') 
trace = ET.SubElement(intersection, 'trace') 

x = np.arange(6).reshape((2,3)) 
s = io.BytesIO() 
np.savetxt(s, x) 
trace.text = s.getvalue() 

print(ET.tostring(root, pretty_print=True, xml_declaration=True, encoding = 'utf-8')) 

daje

<?xml version='1.0' encoding='utf-8'?> 
<intersections> 
    <intersection> 
    <trace>0.000000000000000000e+00 1.000000000000000000e+00 2.000000000000000000e+00 
3.000000000000000000e+00 4.000000000000000000e+00 5.000000000000000000e+00 
</trace> 
    </intersection> 
</intersections> 

Następnie można załadować dane z powrotem do tablicy numpy użyciu np.loadtxt:

for trace in root.xpath('//trace'): 
    print(np.loadtxt(io.BytesIO(trace.text))) 

daje

[[ 0. 1. 2.] 
[ 3. 4. 5.]]