4

PythonリストをXML要素に変換するために作成したPythonコードがいくつかあります。これはLabVIEWとの対話を目的としているため、奇妙なXML配列形式です。とにかく、ここにコードがあります:

def pack(data):
  # create the result element
  result = xml.Element("Array")

  # report the dimensions
  ref = data
  while isinstance(ref, list):
    xml.SubElement(result, "Dimsize").text = str(len(ref))
    ref = ref[0]

  # flatten the data
  while isinstance(data[0], list):
    data = sum(data, [])

  # pack the data
  for d in data:
    result.append(pack_simple(d))

  # return the result
  return result

次に、パックされたXML配列をPythonリストに戻すためのunpack()メソッドを作成する必要があります。配列の次元とデータをうまく抽出できます。

def unpack(element):
  # retrieve the array dimensions and data
  lengths = []
  data = []
  for entry in element:
    if entry.text == "Dimsize":
      lengths.append(int(entry.text))

    else:
      data.append(unpack_simple(entry))

  # now what?

しかし、アレイを平坦化する方法がわかりません。それを行うための効率的な方法は何でしょうか?

編集:Pythonリストと対応するXMLは次のようになります。注:配列はn次元です。

data = [[[1, 2], [3, 4]], [[5, 6], [7, 8]]]

そして、XMLバージョン:

<Array>
  <Dimsize>2</Dimsize>
  <Dimsize>2</Dimsize>
  <Dimsize>2</Dimsize>
  <I32>
    <Name />
    <Val>1</Val>
  </I32>

  ... 2, 3, 4, etc.
</Array>

ただし、実際の形式は重要ではありません。リストをフラット化する方法がわかりません。

data = [1, 2, 3, 4, 5, 6, 7, 8]

に戻る:

data = [[[1, 2], [3, 4]], [[5, 6], [7, 8]]]

与えられた:

lengths = [2, 2, 2]

pack_simple()およびunpack_simple()は、基本的なデータ型(int、long、string、boolean)に対してpack()およびunpack()と同じことを行うと想定します。

4

2 に答える 2

2

裏返しに始める:

def group(seq, k):
    return [seq[i:i+k] for i in range(0, len(seq), k)]

unflattened = group(group(data, 2), 2)

寸法がすべて同じでない場合は、例の方が簡単な場合があります。しかし、上記のコードは機能するはずです。

于 2012-06-22T14:48:30.470 に答える
2

次のことを試してください。

from operator import mul

def validate(array, sizes):
    if reduce(mul, sizes) != len(array):
        raise ValueError("Array dimension incompatible with desired sizes")

    return array, sizes

def reshape(array, sizes):
    for s in sizes:
        array = [array[i:i + s] for i in range(0, len(array), s)]

    return array[0]

data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
length = [2, 2, 3]

print reshape(validate(data, length))

length = [2, 2, 2]

print reshape(validate(data, length))

出力は次のとおりです。

[[[1, 2], [3, 4]], [[5, 6], [7, 8]], [[9, 10], [11, 12]]]
Traceback:
   (...)
ValueError: Array dimension incompatible with desired sizes

numpy別の方法は、配列を使用することです。この単純なタスクの場合、numpyはかなり大きな依存関係ですが、ほとんどの(一般的な)配列関連のタスク/問題にはすでに実装があります。

from numpy import array

print array(data).reshape(*length)  # optionally add .tolist() to convert to list

編集:データ検証を追加しました

編集:numpy配列を使用した例(ヒントを提供してくれたJFSebastianに感謝します)

于 2012-06-22T14:55:02.170 に答える