0

我正在 Python 2.7 中编写一些代码(在 eclipse、Mac OSX 中使用 pydev)来收集有关存储在 xml 文件中的大量卡片信息的信息。这些卡牌来自万智牌,并且都具有非常相似的卡牌结构(名称、游戏费用、类型等)

我正在使用掩码数组来存储卡片上的所有信息。这是我为存储此信息而初始化的数组(在代码中遇到更多字段时会添加更多字段):

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,可以这么说,在您的翻转数组中。但是,对于 numpy 记录数组,这可能不如在真正的关系数据库中那么有效;另一个步骤可能是在主数组中有一个列来指示卡是否具有翻转方面,以避免每次都检查子数组,尽管这会使用更多的内存。

或者,您可以为翻转卡片分配自己的唯一 ID,并将它们存储在与常规卡片相同的记录数组中,因为属性似乎具有相同的名称,然后有一个字段可以是一些设置值,flip_id例如0None没有翻转方面的卡片,然后是那些有翻转的卡片的翻转卡片的 ID。(然后,翻转的卡片可以在其flip_id字段中包含原始卡片的 ID,以将翻转的卡片连接到原始/主卡片。)

于 2013-08-13T12:09:17.070 回答
0

我确实通过实际思考我正在传递的内容来解决我的问题。子阵列的形状类似于 (A,B,C,D...)。您传递的掩码应该具有相同的结构,因此我试图将 True 分配给元组。当我尝试使用 (True,True,True...) 时,它起作用了!

于 2013-09-17T21:18:39.120 回答