我正在 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.
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
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 会自动将数据添加到数组中的第一项,而我无法弄清楚如何适当地填充数据。这是一个错误,还是我在代码中做错了什么!