2013-07-19 53 views
0

我正在用Python 2.7编写一些代码(在eclipse中使用pydev,Mac OSX)来收集存储在xml文件中的一大组卡信息的信息。这些卡来自Magic的聚会,并且都具有非常类似的卡结构(名称,玩的成本,类型等)numpy.ma是否允许遮罩掩码数组中的子遮罩数组?

我正在使用蒙版阵列来存储卡上的所有信息。这里是我初始化存储该信息(更多字段添加,因为它们是在代码中遇到)数组:

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> 

所有顶层卡对象的propertys的是因此我的目的是创建另一个包含“翻转”卡片属性的蒙版数组,因此所有翻转卡片都可以被归类(例如分析属性等)。我可以创建这些属性的蒙版数组及使用附加它作为场的较大的阵列:

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自动将数据添加到数组中的第一项,我不知道如何适当地填充数据。这是一个错误,还是我在代码中做错了事情!

Full Source

回答

0

我没有通过实际想着我经过什么解决我的问题。子阵列的形状类似于(A,B,C,D ...)。你传递一个掩码的时候,它应该具有相同的结构,所以我试图把True赋值给一个元组。当我尝试使用(真实,真实,真实...)它的工作!

0

不是存储在主之一,这是造成你的问题领域的子阵列相反,我建议你保持翻转卡片在各自为阵。从数据库组织的角度考虑它;假设MultiverseId属性对于每张卡或卡+翻转组合都是唯一的,那么可以将其用作主要ID,也就是说,在您的翻转阵列中。但是,对于numpy记录数组,它可能不如在真正的关系数据库中那样高效;一个额外的步骤可能是在主阵列中有一列,以指示该卡是否具有翻转方面以避免每次都检查子阵列,尽管这会使用更多的存储器。

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

+0

感谢您的回复。我通过考虑我所传递的信息,确实解决了我的问题。子阵列的形状类似于(A,B,C,D ...)。你传递一个掩码的时候,它应该具有相同的结构,所以我试图把True赋值给一个元组。当我尝试使用(真实,真实,真实...)它的工作!虽然我确实喜欢你对flip_id的想法。我可能会考虑这一点。 – Garth5689

+0

@ Garth5689很高兴听到你解决它。 – JAB