2013-07-19 56 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