0

XMLファイルに保存されているカード情報の大きなセットに関する情報を収集するために、Python 2.7(Eclipse、Mac OSXでpydevを使用)でいくつかのコードを書いています。これらのカードはマジック ザ ギャザリングのもので、すべてのカード構造が非常に似ています (名前、プレイ コスト、タイプなど)。

マスクされた配列を使用して、すべての情報をカードに格納しています。この情報を格納するために初期化した配列を次に示します (コード内で検出されると、より多くのフィールドが追加されます)。

AllCards=numpy.ma.masked_all(2, dtype=[('Set','a128'),('Name','a128'),
                                       ('Cost','a128'),('CMC','a128'), 
                                       ('Color','a128'),('Type','a128'),
                                       ('Subtype','a128'),('Rarity','a128'),
                                       ('Rules','a512'),('Power','a128'),
                                       ('Toughness','a128'),('PT Box','a128'),
                                       ('Artist','a128'),('Flavor','a512'),
                                       ('MultiverseId','a128')])

この配列に必要なデータを入力してマスクすることはできましたが、この元の配列をより複雑にしようとすると、特定の問題が発生します。Faithful Squireのような、通常のカードよりも複雑なコンポーネント (フリップ アスペクト) を持つカードの場合、xml で次のようにコード化されます。

<card name="Faithful Squire" id="34905b29-481d-9e16-bc50-3b9f5a70dbf2">
  <property name="Cost" value="1ĄĄ" />
  <property name="CMC" value="3" />
  <property name="Color" value="White" />
  <property name="Type" value="Creature" />
  <property name="Subtype" value="Human Soldier" />
  <property name="Rarity" value="Uncommon" />
  <property name="Rules" value="Whenever you cast a Spirit or Arcane spell, you may put a ki counter on Faithful Squire.&#xD;&#xA;At the beginning of the end step, if there are two or more ki counters on Faithful Squire, you may flip it." />
  <property name="Power" value="2" />
  <property name="Toughness" value="2" />
  <property name="PT Box" value="2 / 2" />
  <property name="Artist" value="Mark Zug" />
  <property name="MultiverseId" value="74093" />
  <alternate name="Kaiso, Memory of Loyalty" type="flip">
    <property name="Cost" value="1ĄĄ" />
    <property name="CMC" value="3" />
    <property name="Color" value="White" />
    <property name="Type" value="Legendary Creature" />
    <property name="Subtype" value="Spirit" />
    <property name="Rarity" value="Uncommon" />
    <property name="Rules" value="Flying&#xD;&#xA;Remove a ki counter from Kaiso, Memory of Loyalty: Prevent all damage that would be dealt to target creature this turn." />
    <property name="Power" value="3" />
    <property name="Toughness" value="4" />
    <property name="PT Box" value="3 / 4" />
    <property name="Artist" value="Mark Zug" />
    <property name="MultiverseId" value="74093" />
  </alternate>
</card>

最上位のカード オブジェクトのすべてのプロパティはフィールドであるため、「フリップ」カードのプロパティを保持する別のマスクされた配列を作成して、すべてのフリップ カードをそのように分類できるようにすることを意図しています (およびプロパティの分析など)。 .) これらのプロパティのマスクされた配列を作成し、次を使用してより大きな配列にフィールドとして追加できます。

AllCards=numpy.lib.recfunctions.append_fields(AllCards,AlternateCardType,AlternateCard) 

しかし、次を使用してマスクを更新しようとすると:

AllCards.mask[AlternateCardType][0]=True

次のエラーが表示されます。

Traceback (most recent call last):
    File "/Applications/Eclipse/plugins/org.python.pydev_2.7.3.2013031601/pysrc/pydevd.py", line 1397, in <module>
        debugger.run(setup['file'], None, None)
    File "/Applications/Eclipse/plugins/org.python.pydev_2.7.3.2013031601/pysrc/pydevd.py", line 1090, in run
        pydev_imports.execfile(file, globals, locals) #execute the script
    File "/Users/Andrew/Documents/Workspace/PyGather/PyGather.py", line 61, in <module>
        !AllCards.mask[AlternateCardType][0]=True
TypeError: expected a readable buffer object

このマスクされたサブ配列が最上位の配列に含まれる前に、マスクをそのまま操作することができ、ループと代入を使用して不要なアイテムをマスクできます。numpy.lib.recfunctions.append_fields がデータを配列の最初の項目に自動的に追加するため、これをマスクしようとしていますが、データを適切に埋め込む方法がわかりませんでした。これはバグですか、それともコードで何か間違ったことをしているのですか!

完全なソース

4

2 に答える 2

0

サブ配列をメインのフィールドに格納すると問題が発生するのではなく、反転したカードを独自の配列に保持することをお勧めします。データベース編成の観点から考えてみてください。属性が各カードまたはカード + フリップ コンボに固有であると仮定するMultiverseIdと、それをプライマリ ID として、いわばフリップ配列で使用できます。ただし、これは真のリレーショナル データベースほど効率的ではないかもしれません。追加の手順として、カードにフリップ アスペクトがあるかどうかを示す列をメイン配列に配置して、毎回サブ配列をチェックする必要がないようにすることもできますが、これはメモリを少し多く使用します。

または、フリップ カードに独自の一意の ID を割り当て、通常のカードと同じレコード配列に格納することもできます。これは、プロパティが同じ名前を持っているように見えるflip_idためです0None裏返しの側面のないカードと、裏返しのあるカードの裏返しカードの ID。flip_id(裏返されたカードは、裏返されたカードを元の/メインのカードに接続するために、そのフィールドに元のカードの ID を持つことができます。)

于 2013-08-13T12:09:17.070 に答える