<p>将数组转换为字典将稍微简化访问</p>
<pre><code>In [163]: Ldict={}
In [166]: for r in LAMI:
.....: Ldict[r['name']]={'type':r['type'],'cons':r['cons']}
In [176]: name=ELEM['sets'][0,1]
In [177]: LAMI[np.where(LAMI['name']==name)]['cons']
Out[177]:
array([[ 1.00000000e+01, 3.00000000e-01, 1.83000000e+03,
0.00000000e+00, 0.00000000e+00, 0.00000000e+00]])
In [178]: Ldict[name]['cons']
Out[178]:
array([ 1.00000000e+01, 3.00000000e-01, 1.83000000e+03,
0.00000000e+00, 0.00000000e+00, 0.00000000e+00])
</code></pre>
<p>另一种方法是定义一个<code>Material</code>类,因此每个<code>material</code>都是一个对象。<code>ELEM</code>数组可以有一个带有这些指针的<code>object</code>字段。你知道吗</p>
<p>你曾经把<code>LAMI['cons']</code>作为一个完整的数组使用过吗?如果不是的话,结构化数组格式可能就没那么有用了。你知道吗</p>
<hr/>
<p>使用材质对象的版本:</p>
<pre><code>class Material(object):
def __init__(self, name, _type, cons):
self.name = name
self.type = _type
self.cons = cons.tolist() # more compact display
def __repr__(self):
return str((self.name, self.type, self.cons))
Ldict = {}
for r in LAMI:
Ldict[r['name']] = Material(r['name'], r['type'], r['cons'])
dset = np.dtype([('where','a12'),('material','O')])
dtElem = np.dtype([('conn', '<i4', (3,)), ('sets', dset)])
# nested dtypes
# [('conn', '<i4', (3,)), ('sets', [('where', 'S12'), ('material', 'O')])]
ELEM = np.array([ ([47, 49, 36], ('web', Ldict['gelcoat'])),
([48, 30, 43], ('surf', Ldict['balsa']))],
dtype=dtElem)
print 'ELEM array'
print ELEM
print 'material properties of one element'
print ELEM[0]['sets']['material'].cons
print 'materials of all elements'
print ELEM['sets']['material']
</code></pre>
<p>生产:</p>
<pre><code>ELEM array
[ ([47, 49, 36], ('web', ('gelcoat', 'ISOTROPIC', [10.0, 0.3, 1830.0, 0.0, 0.0, 0.0])))
([48, 30, 43], ('surf', ('balsa', 'TRISOTROPIC', [10.0, 10.0, 2.0, 2.0, 0.3, 128.0])))]
material properties of one element
[10.0, 0.3, 1830.0, 0.0, 0.0, 0.0]
materials of all elements
[('gelcoat', 'ISOTROPIC', [10.0, 0.3, 1830.0, 0.0, 0.0, 0.0])
('balsa', 'TRISOTROPIC', [10.0, 10.0, 2.0, 2.0, 0.3, 128.0])]
</code></pre>
<p>但要得到所有元素的<code>cons</code>列表,我必须使用理解:</p>
<pre><code>print [m.cons for m in ELEM['sets']['material']]
</code></pre>